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

标签 ios objective-c objective-c-blocks

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

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

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

    }else{

    }
}];

[objNetworkManager initiateUrlRequestWithInput:jsonRequestInput];

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

最佳答案

这是我的看法:

如果您没有创建引用循环或任何泄漏,ARC 会自动为您处理。例如,如果 VC1 实例化 NetworkManager 并发布一切都已完成,您离开 VC1 并且它被释放,那么 NetworkManager 引用也将被释放。

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

编辑:示例:

__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 .

关于ios - Objective-C block : How to set an object to nil which uses block-based callback mechanism?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32606303/

相关文章:

ios - KeyboardAvoidingView 无法在 iOS 上使用 React 导航标题和 Material 底部选项卡工作?

ios - 出现弹出窗口时,在 iOS 8 中禁用 UISplitViewController 纵向到横向旋转

iphone - 更改 UITableViewCell 背景

ios - 使用标签来检测是否有东西被窃听

ios - 登录成功后自定义segue

ios - 标签栏不显示图标?

c - 为什么 LLVM 不使用 Xcode 编译 pch 文件中类型定义的 C block ?

objective-c - OCMock 和 block

ios - 在 Objective-C 中命名 block ?

ios - 使用约束旋转 View - Swift