块,自我,保留周期

Wis*_*erd 5 objective-c objective-c-blocks retain-cycle

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

如果我的理解是正确的,你能告诉我吗?

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

谢谢!

Ric*_*III 11

是的,这是正确的,但有一些例外:

保留周期仅在self最终间接保留块时发生,例如myblock在以下属性上设置属性self myproperty:

self.myproperty.myblock = ^{ [self dosomething]; }; // ERROR: Retain Cycle
Run Code Online (Sandbox Code Playgroud)

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

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

当然,除非您dispatch_async在具有保留周期标准的块内调用该函数.

这真的令人困惑,这是我希望得到修复的东西.现在,我个人认为:


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

我希望这会得到修复,因为它是一个非常简单的修复,因为它self的类型是一个__weak instancetype const而不是一个instancetype const.它还将解决在ARC中创建类集群的一些问题,这无疑是最大的问题,但它仍然存在.

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