是否有必要在__weak的完成块中使用__strong?

时间:2014-10-02 00:39:44

标签: objective-c memory-management automatic-ref-counting objective-c-blocks weak-references

我正在开展一个项目,在那里我看到很多代码使用带有__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变量是否安全?我理解这是如何工作的,我是否正确?

0 个答案:

没有答案