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',我需要将我的弱指针传递给这个函数并使用它吗?

4

2 回答 2

1

潜在的。

保留循环是通过引用循环创建的,除了变量上的限定符(即弱、强)之外,这些引用来自的实际变量是不相关的因此strongSelf,您的块引用是一个强引用,self并且您具有相同的保留周期潜力,就像您使用self它自己一样。

回复:评论

让你的块保持弱引用是解决这个问题的标准方法。如果你weakSelf在你的块中使用,那么就没有强引用,如果在调用块时weakSelf调用nil[weakSelf secondFunction]什么都不做——你可以nil在 Objective-C 中发送消息。您不会创建循环,在调用块期间可能会创建引用的强副本,但这将在调用块返回后进行。

于 2012-09-17T23:52:49.333 回答
0

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

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

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

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

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

但就非 ARC 代码而言,我在此代码中看不到任何保留周期。

于 2012-09-18T00:44:20.997 回答