我们是否需要在Objective-C的模块中使用弱自我?

我们是否需要在Objective-C的模块中使用弱自我?,objective-c,objective-c-blocks,weak-references,retain-cycle,Objective C,Objective C Blocks,Weak References,Retain Cycle,我注意到我们在捕捉自我时需要避免强引用循环 示例中的块是self的属性 但是,如果我把一个块作为局部变量放在dispatch\u async语句中会怎么样呢 在这种情况下,即使我直接调用self的方法,它也不会创建一个retain循环,对吗 中是否需要以下生成weakSelf的代码 在给出的示例中,使用dispatch\u async,将不存在保留周期,因此在此处强烈捕获self是安全的。唯一的区别是,如果调用此dispatch_async与实际运行块之间的self被其他所有程序释放,则会稍微延

我注意到我们在捕捉自我时需要避免强引用循环

示例中的块是self的属性

但是,如果我把一个块作为局部变量放在dispatch\u async语句中会怎么样呢

在这种情况下,即使我直接调用self的方法,它也不会创建一个retain循环,对吗

中是否需要以下生成weakSelf的代码


在给出的示例中,使用
dispatch\u async
,将不存在保留周期,因此在此处强烈捕获
self
是安全的。唯一的区别是,如果调用此
dispatch_async
与实际运行块之间的
self
被其他所有程序释放,则会稍微延迟
self
的实际释放时间,并可能会影响释放实际发生在哪个线程上。但一般来说,在使用
dispatch\u async
时,无论采用哪种方式,都没有害处

在一种情况下,您可能希望按照上面编写的示例的方式执行此操作,即如果块中运行的代码有点昂贵,并且只有在绝对必要的情况下才会执行此操作,并且如果其他所有程序都已发布了
self
,则此操作是不必要的


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

使用相关代码更新您的问题。您是对的,这不会导致循环,因为调用回调时会释放块本身。但是如果回调被存储在变量中,则应该考虑何时(以及如果)释放它。在苹果的例子中,只有当
self.block
被重新分配或
self
被释放时,才会释放块。但是,
self
将永远不会被释放,因为始终存在来自块的引用。@rmaddy嗨,我在这里更新了代码。@RaphaelSchweikert谢谢,我同意你的看法。我刚刚用一些示例代码更新了这个问题。只是附带说明一下,上面的代码不能保证strongSelf是有效的。如果weakSelf在赋值语句之前变为nil,则strongSelf将变为nil。strongSelf在此所能保证的是,对于块的其余部分,它要么是有效对象,要么是nil。如果要保证对象为非nil,请将strongSelf声明放在If语句之前,并检查strongSelf是否为nil。很高兴知道。我同意你的看法。谢谢
// 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