块,自我,保留周期

时间:2012-09-11 01:46:31

标签: objective-c objective-c-blocks retain-cycle

我在一个块中引用self并且没有创建保留周期时遇到了一些麻烦。

如果我的理解是正确的,你能否告诉我:

如果我在一个块中引用self,它将创建一个保留周期,而我应该在块外部创建一个弱引用,然后在块内使用该弱引用?

谢谢!

1 个答案:

答案 0 :(得分:11)

是的,这是正确的,只有少数例外:

仅当self最终间接保留该块时才会发生保留周期,例如在myblock self的属性上设置属性myproperty

self.myproperty.myblock = ^{ [self dosomething]; }; // ERROR: Retain Cycle

但是,在使用块之类的调度代码时,通常不会发生保留周期,如下所示:

dispatch_async(dispatch_get_main_queue(), ^{ [self dosomething]; }); // Safe, dispatch_async will not be retained by you

除非您在具有保留周期标准的块内调用dispatch_async函数。

这真的令人困惑,而且我希望得到修复。现在,我个人认为:


情况并非总是如此,在ARC之前的代码中,这不是问题,但由于块现在会自动保留它们捕获的任何对象,因此这是一个问题。

我希望通过让self的类型为__weak instancetype const而不是instancetype const来修复此问题,因为这是一个非常简单的修复方法。它还可以解决在ARC中创建类集群的一些问题,这无疑是最大的问题,但它仍然存在。

就保留周期的优势而言,并不多。