Objective-C blocks: 如何将一个使用block-based回调机制的对象设置为nil?

Objective-C blocks: How to set an object to nil which uses block-based callback mechanism?

我有一个 NetworkManager class,它负责连接到基于 JSON 的 Web 服务并 return 发送服务器响应。我正在使用完成处理程序块来 return 来自 NetworkManager 的成功或错误响应(在内部,NetworkManager 使用基于委托的 NSURLConnection)。

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

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

    }else{

    }
}];

[objNetworkManager initiateUrlRequestWithInput:jsonRequestInput];

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

这是我对此的看法:

如果您没有创建引用循环或任何泄漏,ARC 会自动为您处理。例如,如果 VC1 实例化 NetworkManager 并且 post 一切都已完成,您离开 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

如果可以同时调用web服务,可以在public数据中使用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不会保留,会释放,其中的block会自动置为nil。