2015-06-18 2 views
-1

Так как следующий код:Зачем нужен слабый я в блоке?

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

потому что, если 'self' явно не является слабым, тогда он сильный, и в этом случае он вызывает цикл сохранения, что приводит к утечкам памяти. –

ответ

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

ли не ПРИЧИНА сохранить цикл, если блок завершения не хранится в self. Если это свойство, то self будет иметь сильную ссылку на блок, и блок будет иметь сильную ссылку на self, вызывающий цикл сохранения. Вот почему вам необходимо использовать weak, чтобы избежать этого цикла сохранения. Но помните, вы должны использовать слабое я только внутри блоков, которые хранятся как свойства или ивары внутри себя.

Если блок завершения вызывается только в methodThatTakesABlock, тогда вам не нужно использовать слабое «я», так как блок не сохраняется. В этом случае блок будет иметь сильную ссылку на self, но сам не будет иметь один к блоку, поэтому в этом случае цикл сохранения не будет.

+0

Это не единственный случай, который вызывает цикл удержания, когда в блоках используется сильное 'self'. – mostruash

Смежные вопросы