保留周期关注

时间:2017-05-05 09:32:07

标签: ios objective-c memory-leaks retain-cycle

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

// interface:
@property NSArray *foos;


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

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

  

Block隐含地保留“自我”;明确提到“自我”以表明这是预期的行为。

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

1 个答案:

答案 0 :(得分:6)

您的示例中没有循环。

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

虽然您的情况很不寻常,但是创建一个块以立即将其应用于同一个表达式中,当您将块传递给另一个方法时,无论是直接还是将其存储在局部变量中并传递变量值,都会出现类似的情况 - 没有创建循环。

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

HTH