Objective-C:我们应该在 block 内使用 weak self 还是在使用它之前将 weak self 分配给 strong ?

标签 objective-c objective-c-blocks

正如我们所知,在 block 中使用 strong self 会导致循环保留和内存泄漏。通常的做法是在 block 中使用弱 self ,还是将弱 self 分配给 block 中的 strong self 然后按原样使用它以便在 block 执行期间不释放弱 self 更好?这重要吗,因为弱 self 无论如何都会被清零?

最佳答案

由于弱变量的易变性,您应该小心使用它们。如果您在多线程环境中使用弱变量,将弱变量分配给强变量并在使用前检查是否为 nil 被认为是一种很好的做法。这将确保该对象不会在您的方法中途被释放,从而导致意外结果。

考虑以下情况:

__weak id var;

//...

if(var != nil)
{
    //var was released here on another thread and there are not more retaining references.
    [anotherObj performActionWithAnObjThatMustNotBeNil:var]; //<- You may crash here.
}

编译器可以配置为在连续访问弱变量时发出警告。

另一方面,如果您在主线程中使用,并且对对象的所有调用都在主线程中,则此问题没有实际意义,因为对象将在 block 调用之前或之后被释放,因此它直接访问弱变量是安全的。

关于Objective-C:我们应该在 block 内使用 weak self 还是在使用它之前将 weak self 分配给 strong ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23297049/

相关文章:

objective-c - objective-C中 block 捕获变量的规则

objective-c - 懒惰的图像绘制

objective-c - 子类可以覆盖非公共(public)方法吗

ios - Short 从字典中获取带有数组键的对象

objective-c - 忽略用 "warn_unused_result"属性声明的函数的返回值

iphone - EXC_BAD_ACCESS 复制或保留 Block 时

ios - 针对应用程序和测试目标的链接框架

ios - 带有 block 回调的自定义 UIAlertView

ios - 在后台队列中运行多个 api 调用而不卡住 UI?

objective-c - 以下 GCD/ block 场景的推荐模式是什么?