在从块运行的方法中对self的强引用

时间:2015-03-20 17:35:16

标签: ios objective-c objective-c-blocks

所以,我知道如果你在self内部保存一个块,然后访问该块内的self,你需要创建和使用__weak id weakSelf = self;之类的东西。

我的问题是,这是否也扩展到从该块调用的函数?如下所示,以下内容会导致保留周期:

self.block = ^{ [weakSelf myFunction]; }
- (void) myFunction { self.counter++; }

感谢您的时间!

1 个答案:

答案 0 :(得分:2)

这不会创建保留周期,因为方法中的self实际上是Objective C运行时传递的参数(使用objc_msgSend等)。因此,让我们在您的代码示例中考虑两种可能的方案。由于保留对象的释放,weakSelf已被清零 - 传递给nil的消息将被忽略。 weakSelf未归零,在这种情况下,它由Objective C运行时作为其self参数传递给消息。