Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么在街区需要弱自我?_Ios_Block - Fatal编程技术网

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
不是显式弱的,那么它是强的,在这种情况下,它会导致保留循环,导致内存泄漏。这不是在块内使用strong
self
时导致保留周期的唯一情况。
[self methodThatTakesABlock:^ {
    [self doSomething];
}];