我接管了另一家公司的项目,我经常在为变量赋值时看到这部分代码:
// interface:
@property NSArray *foos;
// somewhere in implementation:
BOOL foosExist = ^BOOL {
return self.foos.count > 0; // self inside block
}();
此外,编译器在通过基础变量foos
将块内部引用到_foos
属性时声明:
Block隐含地保留“自我”;明确提到“自我”以表明这是预期的行为。
这个自我内部块是否真正创建了保留周期?如果没有,为什么?有人可以详细说明吗?
答案 0 :(得分:6)
您的示例中没有循环。
您的块只是在评估表达式时创建的值,它们会立即应用以生成BOOL
值。
虽然您的情况很不寻常,但是创建一个块以立即将其应用于同一个表达式中,当您将块传递给另一个方法时,无论是直接还是将其存储在局部变量中并传递变量值,都会出现类似的情况 - 没有创建循环。
如果您创建了相同的块但是将其存储到实例变量(不一个局部变量)中,那么self
将引用该块,块会引用self
,你会有一个循环。这本身并不坏,只有在周期永远不会破坏的情况下才会变坏,这会导致泄漏。但是,如果在某个时刻循环被破坏,比如通过在实例变量中写入不同的值,则循环永远不会成为问题。
HTH