iOS - 在使用成功 block 进行异步网络调用时查看 Controller 内存管理

标签 ios memory-management asynchronous uiviewcontroller objective-c-blocks

这段代码有什么问题吗?

[[MyNetworkManager shared] getSomeData:param success:^(NSDictionary *response) { 
    self.view.backgroundColor = [UIColor redColor];
} failure:^(NSString *errorString) {

}];

具体来说,如果调用此方法的 View Controller 在网络任务完成之前被释放,会发生什么?这里需要weakSelf、strongSelf吗?为什么或者为什么不?

如果网络管理器从服务器获取有效数据,则网络管理器只需进行网络调用并将响应返回给调用 View Controller :
success(dictionary);

对我来说这似乎很好,因为 block 本身没有保留在任何地方,但我可能是错的......

最佳答案

使用self这将防止 View Controller 在网络请求完成之前被释放。在这种情况下,这里没有任何建议您需要这样做,因此使用 self在这里似乎不合适。我们可以制造您可能需要保留 View Controller 的场景(但这些场景也暗示了一定程度的代码异味)。

您可以使用 weakSelf模式在这里,这不会在 View Controller 上保持强引用。因此,如果 View Controller 在网络请求完成之前被关闭,它将被释放,weakSelf指针将是 nil .这似乎是一种合乎逻辑的方法。

您不需要使用 weakSelf/strongSelf模式,虽然。如果需要确保指针不是 nil,则使用它。当 block 开始时,它不会变成nil在 block 执行期间。这不适用于本示例。

所以,这意味着你可能会有类似的东西:

typeof(self) __weak weakSelf = self;

[[MyNetworkManager shared] getSomeData:param success:^(NSDictionary *response) { 
    weakSelf.view.backgroundColor = [UIColor redColor];
} failure:^(NSString *errorString) {

}];

请注意,您必须问自己是否真的需要在 View Controller 被释放后继续运行查询。如果没有,您可以取消此请求,然后在 View 关闭后取消它。但这完全是一个单独的话题。

关于iOS - 在使用成功 block 进行异步网络调用时查看 Controller 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28034925/

相关文章:

ios - 查询 Firebase 数据库中的多个键

ios - 为什么 NSHashTable 保持对指针的引用?

c++ - 在单个分配中分配一个包含字符串的结构

c++ - C++ 中是否存在内存泄漏 "undefined behavior"类问题?

haskell - 如何使括号免受异步异常的影响?

c# - 即使我的服务器套接字已收到所有字节,为什么 SendAsync 不会在 SocketAsyncEventArgs 上引发 Completed 事件?

带有尺寸等级的 iOS 错误帧尺寸

html - 通过 safari 启动 IMDb iOS 应用程序 - 它接受命令吗?

ios - Objective C - 每个 View Controller 的全局变量

javascript - 异步/同步 : how can I be sure a Javascript function will execute after the for loop?