如果我从一个块内部调用的函数引用“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',我是否需要将弱指针传递给此函数并使用它?
答案 0 :(得分:1)
潜在
保留周期是通过强引用的循环创建的,除了变量上的限定符(即弱,强)这些引用来自的实际变量来自无关紧要。因此,您的广告代码段引用的strongSelf
是对self
的强烈引用,您保留周期的可能性与您自己使用self
一样。
回复:评论
让您的块保持弱引用是解决此问题的标准方法。如果您在块中使用weakSelf
,则没有强引用,如果在调用块weakSelf
时nil
为[weakSelf secondFunction]
,则调用nil
将无效 - 您允许在Objective-C中发送{{1}}消息。您不会创建一个循环,在块的调用期间,可能会创建一个强大的引用副本,但这将在调用该块后返回。
答案 1 :(得分:0)
我可能错了,但我在这里看不到保留周期。
块被分配堆栈,除非它们被复制到堆中。
我不使用ARC,所以你的里程可能会有所不同,但至少没有ARC,当块被分配堆栈并且没有保留对self的引用时,我不会期望保留周期。
对self的引用将被复制到块堆栈中,如果它超出范围,块将继续访问副本,直到块终止。
我不想知道ARC如何管理这个,我想如果你要使用ARC,你应该知道它是如何工作的。
但就非ARC代码而言,我认为此代码中没有任何保留周期。