保留周期关注

Ner*_*eru 0 memory-leaks objective-c ios retain-cycle

我接管了另一家公司的项目,我经常在为变量赋值时看到这部分代码:

// interface:
@property NSArray *foos;


// somewhere in implementation:
BOOL foosExist = ^BOOL {
    return self.foos.count > 0; // self inside block
}();
Run Code Online (Sandbox Code Playgroud)

此外,编译器在foos通过底层变量引用内部块到属性时声明_foos:

Block隐含地保留了"自我"; 明确提到"自我"以表明这是预期的行为.

这个自我内部块是否真正创建了保留周期?如果没有,为什么?有人可以详细说明吗?

CRD*_*CRD 6

您的示例中没有循环.

您的块只是在评估表达式时创建的值,它们会立即应用以生成BOOL值.

虽然你的情况很不寻常,创建一个块以立即将它应用于同一个表达式,当你将一个块直接传递给另一个方法时,或者通过将它存储在局部变量中并传递变量值,就会发生类似的情况 - 没有循环是创建.

相反,如果您创建了相同的块但将其存储到实例变量(不是局部变量)中,那么self将引用该块,该块将引用该块self,并且您将有一个循环.这本身并不坏,只有在周期永远不会破坏的情况下才会变坏,这会导致泄漏.但是,如果在某个时刻循环被破坏,比如通过在实例变量中写入不同的值,则循环永远不会成为问题.

HTH