Objective-C块:如何将对象设置为nil,使用基于块的回调机制?

时间:2015-09-16 10:40:26

标签: ios objective-c objective-c-blocks

我有一个NetworkManager类,它执行连接到基于JSON的Web服务并返回服务器响应的任务。我正在使用完成处理程序块来从NetworkManager返回成功或错误响应(在内部,NetworkManager使用基于委托的NSURLConnection)。

NetworkManager *objNetworkManager= [[NetworkManager alloc]init];

[objNetworkManager setCompletionHandler:^(NSDictionary *resp, BOOL isSuccess){
    if (isSuccess) {

    }else{

    }
}];

[objNetworkManager initiateUrlRequestWithInput:jsonRequestInput];

现在一切正常,我的网络请求使用此NetworkManager类按预期工作。我担心的是每次进行Web服务调用时,我都会分配一个NetworkManager实例。但是,我应该在哪里将objNetworkManager设置为nil?因为它使用块回调,我不确定如何有效地处理内存。请指教!!

2 个答案:

答案 0 :(得分:2)

以下是我对此的看法:

如果您没有创建参考周期或任何泄漏,ARC会自动为您处理。例如,如果VC1实例化了NetworkManager并且发布了所有内容,那么您将退出VC1并取消分配,然后将取消分配NetworkManager引用。

如果您真的想要主动发布NetworkManager,那么您可以在成功和错误完成块中执行此操作。我就这样做:)。

编辑:示例:

__weak MyViewController *aBlockSelf = self;

// Save User Preferences (/ics/markavailable)
self.requestHandler = [[MyRequestHandler alloc] initWithEndPoint:@"/fetch/request" body:aBodyData container:self.navigationController.view loadingOverlayTitle:@"Loading..." successHandler:^(NSDictionary *iResponse) {
    // Do success handling

    aBlockSelf.requestHandler = nil;
} andErrorHandler:^(NSString *iMessage, NSString *iKey, NSInteger iErrorCode, BOOL iIsNetworkError) {
   // Do success handling

   aBlockSelf.requestHandler = nil;
}];

[self.requestHandler executeRequest];

要了解保留周期,请查看this thread

答案 1 :(得分:0)

如果可以同时调用Web服务,则可以在公共数据中使用NSMutableArray来保存管理器。

//Public data manager class add a NSMutableArray to save managers.
@property (nonatomic, strong) NSMutableArray *requestingManager;

NetworkManager *objNetworkManager= [[NetworkManager alloc]init];
[objNetworkManager setCompletionHandler:^(NSDictionary *resp, BOOL isSuccess){
    //remove when finish
    [[PublicData instance].requestingManager removeObject:objNetworkManager];
    if (isSuccess) {

    }else{

    }
}];
[objNetworkManager initiateUrlRequestWithInput:jsonRequestInput];
//add manager when request
[[PublicData instance].requestingManager addObject:objNetworkManager];

删除objNetworkManager后,objNetworkManager将不会保留,并且会释放,其中的块将自动设置为nil。