这段代码有什么问题吗?
[[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/