如果我从 block 内部调用的函数引用“self”,是否会创建一个保留循环?
__weak id weakSelf = self;
- (void)firstFunction
{
id strongSelf = weakSelf;
if (!strongSelf) return;
[anObject performBlock:^{
[strongSelf secondFunction];
}];
}
- (void)secondFunction
{
[self doSomeCrazyStuff];
self.counter++;
//etc.
}
我在“secondFunction”中调用“self”,是否需要将我的弱指针传递给此函数并改为使用它?
最佳答案
有可能。
保留循环是通过strong 引用循环创建的,变量 上的限定符(即弱、强)是这些引用所在的实际变量来自是无关紧要的。因此,您的 block 引用的 strongSelf
是对 self
的强引用,并且您具有与使用 self
相同的保留周期潜力本身。
回复:评论
让您的 block 保持弱引用是解决此问题的标准方法。如果您在 block 中使用 weakSelf
则没有强引用,如果在 block 被调用时 weakSelf
是 nil
那么调用 [weakSelf secondFunction]
什么都不做——你可以在 Objective-C 中发送消息 nil
。您不会创建循环,在 block 调用期间可能会创建引用的强副本,但这将在 block 调用返回后进行。
关于objective-c - 在 block 保留周期中调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12468362/