5

我在一个块内引用 self 而不是创建保留周期时遇到了一些麻烦。

您能否告诉我我的理解是否正确:

如果我曾经在块内引用 self ,它将创建一个保留循环,相反我应该在块外创建对 self 的弱引用,然后在块内使用该弱引用?

谢谢!

4

1 回答 1

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' 类型设置为 a__weak instancetype const而不是 a instancetype const。它还可以解决在 ARC 中创建类集群的一些问题,诚然这不是最大的问题,但它仍然存在。

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

于 2012-09-11T01:57:52.773 回答