在块中调用函数的保留循环问题

4
如果我从某个块内部调用的函数引用了 '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个回答

1

可能。

保留循环是通过具有引用的循环创建的,除了变量上的限定符(即弱、强)外,这些引用来自的实际变量是无关紧要的。因此,由您的块引用的strongSelf是对self的强引用,您具有与使用self本身相同的保留循环潜力。

关于评论:

让您的块维护一个弱引用是解决此问题的标准方法。如果在您的块中使用weakSelf,则没有强引用,如果在调用块时weakSelfnil,则调用[weakSelf secondFunction]将不会执行任何操作-在Objective-C中允许向nil发送消息。您不会创建循环,在调用块期间可能会创建引用的强副本,但这将在块返回后消失。


如果我去掉strongSelf并使用weakSelf来调用“secondFunction”,那么“secondFunction”中的代码行是否会创建对self的强引用?我之所以问这个问题,是因为“secondFunction”是从块内部调用的。 - Thawe

0

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

除非将块复制到堆栈中,否则块是堆栈分配的。

我不使用ARC,所以你的情况可能有所不同,但至少在没有ARC的情况下,当块被堆栈分配并且它没有对self进行保留引用时,我不会期望出现保留循环。

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

我不认为自己知道ARC如何管理此问题,我想如果您要使用ARC,您应该自己知道它的工作原理。

但就非ARC代码而言,我在这段代码中看不到任何保留循环。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接