我在一个块中引用self并且没有创建保留周期时遇到了一些麻烦。
如果我的理解是正确的,你能否告诉我:
如果我在一个块中引用self,它将创建一个保留周期,而我应该在块外部创建一个弱引用,然后在块内使用该弱引用?
谢谢!
答案 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中创建类集群的一些问题,这无疑是最大的问题,但它仍然存在。
就保留周期的优势而言,并不多。