就像下面的代码一样:
__weak typeof(self) weakSelf = self;
[self methodThatTakesABlock:^ {
[weakSelf doSomething];
//[self doSomething];//Why not this line?
}];
答案 0 :(得分:1)
[self methodThatTakesABlock:^ {
[self doSomething];
}];
除非完成块存储在self
内,否则不会导致保留周期。如果它是属性,则self
将具有对该块的强引用,并且该块将具有对self
的强引用,从而导致保留周期。这就是为什么你需要使用weak
来避免这种保留周期的原因。但请记住,您必须仅在作为属性存储的块中使用弱自我,或者在自我中使用iv。
如果仅在methodThatTakesABlock
中调用完成块,那么您不必使用弱自我,因为不保留该块。在这种情况下,块将具有对self
的强引用,但是self不会有一个朝向块,因此在这种情况下没有保留周期。