Когда и почему я должен объявить локальную переменную как __weak с помощью ARC?

Майк Эш написал это введение в ARC , где он вводит что-то вроде:

__weak Foo *_weakFoo = [object foo];

Зачем мне делать это для локальной временной переменной? __weak - это ссылка обнуления, которая автоматически установит указатель _weakFoo на ноль, как только объект, на который указывает ссылка, будет освобожден. Кроме того, __weak доступен только в iOS> = 5.

Когда я столкнусь с проблемами, если просто сделаю это?:

Foo *_weakFoo = [object foo];

Всегда ожидается возврат объекта или nil. Я предполагаю следующее:

Foo *_weakFoo = [object foo];
[self doSomethingStupid]; // does something bad so foo gets deallocated
[_weakFoo doIt]; // CRASH! msg sent to deallocated instance 0x123456

Одна вещь, которая все еще беспокоит меня с ARC: когда он узнает, что мне больше не нужен объект? Я бы сказал, что когда я устанавливаю указатель на nil или на что-то еще, он выясняет, что ранее упомянутый объект больше не нужен этому владельцу и, следовательно, может быть удален. Но суть в том, что я установил ноль. Так что все равно ноль!

Так когда же __weak для локальной переменной имеет смысл и какие безумные вещи мне нужно делать где-то еще, чтобы это мне действительно нужно?

5
задан Radar3 22 October 2015 в 15:39
поделиться