我正在开展一个项目,在那里我看到很多代码使用带有__strong
引用的完成块的__weak
变量来对完成块中的该对象执行操作。如果在取消分配视图后触发完成块,我们希望避免EXEC_BAD_ACCESS崩溃,并且在完成块完成之前也不保留视图控制器。这是一些示例伪代码:
__weak UIViewController *weakSelf = self;
[[DataManager sharedInstance] dataWithCompletionBlock:^(id data) {
if (!weakSelf) return;
__strong UIViewController *strongSelf = weakSelf;
strongSelf.data = data;
}];
我理解内存管理的方式weakSelf
,如果它通过了条件检查,则最早在运行循环结束之前不会被释放,因此__strong
引用是不必要的。相反,__weak
引用可以安全地执行,因为有条件已经检查它以防止EXEC_BAD_ACCESS崩溃。只有当我们使用自己的完成块调用异步方法时才需要__strong
引用,该完成块需要视图控制器不被取消分配。
这里的正确用法是什么? __strong
是否必要?或者只是简单地访问__weak
变量是否安全?我理解这是如何工作的,我是否正确?