Так как следующий код:Зачем нужен слабый я в блоке?
__weak typeof(self) weakSelf = self;
[self methodThatTakesABlock:^ {
[weakSelf doSomething];
//[self doSomething];//Why not this line?
}];
Так как следующий код:Зачем нужен слабый я в блоке?
__weak typeof(self) weakSelf = self;
[self methodThatTakesABlock:^ {
[weakSelf doSomething];
//[self doSomething];//Why not this line?
}];
[self methodThatTakesABlock:^ {
[self doSomething];
}];
ли не ПРИЧИНА сохранить цикл, если блок завершения не хранится в self
. Если это свойство, то self
будет иметь сильную ссылку на блок, и блок будет иметь сильную ссылку на self
, вызывающий цикл сохранения. Вот почему вам необходимо использовать weak
, чтобы избежать этого цикла сохранения. Но помните, вы должны использовать слабое я только внутри блоков, которые хранятся как свойства или ивары внутри себя.
Если блок завершения вызывается только в methodThatTakesABlock
, тогда вам не нужно использовать слабое «я», так как блок не сохраняется. В этом случае блок будет иметь сильную ссылку на self
, но сам не будет иметь один к блоку, поэтому в этом случае цикл сохранения не будет.
Это не единственный случай, который вызывает цикл удержания, когда в блоках используется сильное 'self'. – mostruash
потому что, если 'self' явно не является слабым, тогда он сильный, и в этом случае он вызывает цикл сохранения, что приводит к утечкам памяти. –