2012-09-17 45 views
4

如果我从一个块内调用的函数引用“自我”,是否会创建一个保留周期?块保留周期调用函数

__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',是否需要将弱指针传入此函数并使用它?

回答

1

可能。

甲保留周期是由具有强引用一个周期,除了限定符创建(即弱,强)对可变其中这些引用来自实际变量是无关紧要的。因此,您所在区域引用的strongSelf是对self的强烈参考,您可以像保留循环一样使用self本身。

回复:评论

有您块保持弱引用是标准的方法来解决这一问题。如果在块中使用weakSelf,则没有强参考,如果在调用该块时weakSelfnil,则调用[weakSelf secondFunction]将不会执行任何操作 - 您可以在Objective-C中发送消息nil。在块的调用期间,您不会创建一个循环,但可能会创建一个强引用的副本,但是在调用块返回后,这个副本将会继续。

+0

如果我摆脱strongSelf和使用weakSelf调用“secondFunction”,然后会在“secondFunction”的代码行创建自强引用?我问,因为'secondFunction'是从一个块内调用的。 – Thawe

+0

@Thawe - 添加到回答 – CRD

0

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

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

我不使用ARC所以你的里程可能会有所不同,但至少没有ARC时,堆栈中分配块我就没有一个保留周期的预期,它已经没有保留的参考自我。

自参考将被复制到块堆叠,如果它超出范围的块将继续,直到终止块访问副本。

我不认为知道ARC如何管理这一点,我想,如果你要使用ARC你应该知道自己是如何工作的。

但就非ARC代码而言,我认为没有这个代码任何挽留周期。