在块保持循环中调用函数

时间:2012-09-17 23:15:32

标签: objective-c ios block retain-cycle

如果我从一个块内部调用的函数引用“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',我是否需要将弱指针传递给此函数并使用它?

2 个答案:

答案 0 :(得分:1)

潜在

保留周期是通过引用的循环创建的,除了变量上的限定符(即弱,强)这些引用来自的实际变量来自无关紧要。因此,您的广告代码段引用的strongSelf是对self的强烈引用,您保留周期的可能性与您自己使用self一样。

回复:评论

让您的块保持弱引用是解决此问题的标准方法。如果您在块中使用weakSelf,则没有强引用,如果在调用块weakSelfnil[weakSelf secondFunction],则调用nil将无效 - 您允许在Objective-C中发送{{1}}消息。您不会创建一个循环,在块的调用期间,可能会创建一个强大的引用副本,但这将在调用该块后返回。

答案 1 :(得分:0)

我可能错了,但我在这里看不到保留周期。

块被分配堆栈,除非它们被复制到堆中。

我不使用ARC,所以你的里程可能会有所不同,但至少没有ARC,当块被分配堆栈并且没有保留对self的引用时,我不会期望保留周期。

对self的引用将被复制到块堆栈中,如果它超出范围,块将继续访问副本,直到块终止。

我不想知道ARC如何管理这个,我想如果你要使用ARC,你应该知道它是如何工作的。

但就非ARC代码而言,我认为此代码中没有任何保留周期。

相关问题