为什么需要弱自我?

时间:2015-06-18 13:53:29

标签: ios block

就像下面的代码一样:

__weak typeof(self) weakSelf = self;
[self methodThatTakesABlock:^ {
    [weakSelf doSomething];
    //[self doSomething];//Why not this line?
}];

1 个答案:

答案 0 :(得分:1)

[self methodThatTakesABlock:^ {
    [self doSomething];
}];

除非完成块存储在self内,否则会导致保留周期。如果它是属性,则self将具有对该块的强引用,并且该块将具有对self的强引用,从而导致保留周期。这就是为什么你需要使用weak来避免这种保留周期的原因。但请记住,您必须仅在作为属性存储的块中使用弱自我,或者在自我中使用iv。

如果仅在methodThatTakesABlock中调用完成块,那么您不必使用弱自我,因为不保留该块。在这种情况下,块将具有对self的强引用,但是self不会有一个朝向块,因此在这种情况下没有保留周期。