objective-c - 我们需要在 Objective-C 的 block 中使用 weak self 吗?

标签 objective-c objective-c-blocks weak-references retain-cycle

我注意到了 Apple's documentation说我们在捕获 self 时需要避免强引用循环。

示例中的 block 是 self 的属性。

但是如果我将一个 block 作为局部变量放在 dispatch_async 语句中呢?

在这种情况下,即使我直接调用self的方法也不会产生retain cycle吧?

this article 是否需要以下代码生成 weakSelf? ?

// your code
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
    __strong typeof(weakSelf) strongSelf = weakSelf;
    if (strongSelf) {
        [strongSelf doThis];
        [strongSelf doThat];
        [Manager.sharedInstance updateSuccessCount];
    }
});

// more code

最佳答案

在给出的示例中,使用 dispatch_async ,不会有保留周期,所以捕获 self 是安全的强烈在这里。唯一的区别是如果self在这dispatch_async之间被其他一切释放被调用,当 block 实际运行时,它会稍微延迟 self 的实际释放。在那短暂的时间内,并且还可能影响释放实际发生在哪个线程上。但总的来说,使用 dispatch_async 时无论哪种方式都没有坏处。 .

您可能希望按照上面编写的示例的方式执行此操作的一种情况是,如果 block 中运行的代码有些昂贵并且只希望在绝对必要时执行,并且如果 self 则没有必要。已经被其他一切释放了。

另一种情况可能是 if self使用大量内存并在其他东西开始消耗大量内存之前正常释放。在那种情况下,您可能不希望同时分配这两个实例。

关于objective-c - 我们需要在 Objective-C 的 block 中使用 weak self 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36606655/

相关文章:

ios - 显示 block 中的下一个 ViewController

objective-c - ARC : property vs ivar: copy, 弱

java - 为什么ReferenceQueue总是空的?

iphone - 如何使用 Objective-C 读取 XHTML 文件标签?

iOS:NSString 与 C malloc 的错误和崩溃

ios - UISearchController 在索引路径上崩溃

python - weakref (WeakKeyDictionary) 来框架 (FrameType) 对象

objective-c - 如何从一个 View Controller 访问另一个 View Controller 的变量值?

cocoa-touch - 取消 UIView animateWithDuration 中的 block

objective-c - 是否可以在 Objective-C 中创建 "Block"对象的类别