我在一个块内引用 self 而不是创建保留周期时遇到了一些麻烦。
您能否告诉我我的理解是否正确:
如果我曾经在块内引用 self ,它将创建一个保留循环,相反我应该在块外创建对 self 的弱引用,然后在块内使用该弱引用?
谢谢!
我在一个块内引用 self 而不是创建保留周期时遇到了一些麻烦。
您能否告诉我我的理解是否正确:
如果我曾经在块内引用 self ,它将创建一个保留循环,相反我应该在块外创建对 self 的弱引用,然后在块内使用该弱引用?
谢谢!
是的,这是正确的,但有一些例外:
仅当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
' 类型设置为 a__weak instancetype const
而不是 a instancetype const
。它还可以解决在 ARC 中创建类集群的一些问题,诚然这不是最大的问题,但它仍然存在。
就保留周期的优势而言,并不多。