块中方法 运行 中对自身的强引用
Strong reference to self inside a method running from a block
所以,我知道如果你在 self
中保存一个块,然后在该块中访问 self
,你需要创建和使用类似 __weak id weakSelf = self;
的东西。
我的问题是,这是否也扩展到从该块调用的函数?如,以下是否会导致保留周期:
self.block = ^{ [weakSelf myFunction]; }
- (void) myFunction { self.counter++; }
感谢您的宝贵时间!
这不会创建保留循环,因为方法中的self
实际上是Objective C运行时传递的参数(使用objc_msgSend
等)。因此,让我们考虑您的代码示例中可能出现的两种情况。由于持有对象的释放,weakSelf
已被清零 - 传递给 nil
的消息被忽略。 weakSelf
未归零,在这种情况下,它由 Objective C 运行时作为其 self
参数传递给消息。
所以,我知道如果你在 self
中保存一个块,然后在该块中访问 self
,你需要创建和使用类似 __weak id weakSelf = self;
的东西。
我的问题是,这是否也扩展到从该块调用的函数?如,以下是否会导致保留周期:
self.block = ^{ [weakSelf myFunction]; }
- (void) myFunction { self.counter++; }
感谢您的宝贵时间!
这不会创建保留循环,因为方法中的self
实际上是Objective C运行时传递的参数(使用objc_msgSend
等)。因此,让我们考虑您的代码示例中可能出现的两种情况。由于持有对象的释放,weakSelf
已被清零 - 传递给 nil
的消息被忽略。 weakSelf
未归零,在这种情况下,它由 Objective C 运行时作为其 self
参数传递给消息。