Ios 为什么在街区需要弱自我?
就像下面的代码一样:Ios 为什么在街区需要弱自我?,ios,block,Ios,Block,就像下面的代码一样: __weak typeof(self) weakSelf = self; [self methodThatTakesABlock:^ { [weakSelf doSomething]; //[self doSomething];//Why not this line? }]; 除非完成块存储在self中,否则不会导致保留循环。如果它是一个属性,self将对该块具有强引用,并且该块将对self具有强引用,从而导致保留循环。这就是为什么需要使用弱,以避免此保留
__weak typeof(self) weakSelf = self;
[self methodThatTakesABlock:^ {
[weakSelf doSomething];
//[self doSomething];//Why not this line?
}];
除非完成块存储在self
中,否则不会导致保留循环。如果它是一个属性,self
将对该块具有强引用,并且该块将对self
具有强引用,从而导致保留循环。这就是为什么需要使用弱
,以避免此保留周期。但请记住,您必须仅在存储为self中的属性或ivar的块中使用弱self
如果只在采用SABLOCK的
方法中调用完成块,则不必使用弱self,因为该块不会被保留。在这种情况下,块将有一个对self
的强引用,但self不会有一个指向块的引用,因此在这种情况下没有保留循环。因为如果self
不是显式弱的,那么它是强的,在这种情况下,它会导致保留循环,导致内存泄漏。这不是在块内使用strongself
时导致保留周期的唯一情况。
[self methodThatTakesABlock:^ {
[self doSomething];
}];