Mike Ash has written this introduction to ARC где он вводит что-то вроде:Когда и почему я хочу объявить локальную переменную как __weak с помощью ARC?
__weak Foo *_weakFoo = [object foo];
Почему я хотел бы сделать это для локальной, временной переменной? __weak - это ссылка на обнуление, которая автоматически установит указатель _weakFoo на нуль, как только ссылочный объект будет освобожден. Кроме того, __weak доступна только в прошивкой> = 5.
Когда я запускаю в беду, когда я просто это сделать ?:
Foo *_weakFoo = [object foo];
Он всегда должен возвращать объект или ноль. Я думаю, это:
Foo *_weakFoo = [object foo];
[self doSomethingStupid]; // does something bad so foo gets deallocated
[_weakFoo doIt]; // CRASH! msg sent to deallocated instance 0x123456
Одна вещь, которая до сих пор ошибки меня с ARC: Когда он знает, что я не нужен объект больше? Я утверждаю, что когда я устанавливаю указатель на нуль или что-то еще, он выясняет, что ранее упомянутый объект больше не нужен этому владельцу и, следовательно, может уйти. Но дело в том, что я установил его на ноль. Так что все равно!
Итак, когда будет __weak для локальной переменной иметь смысл, и о какой сумасшедшей вещи я должен делать где-то в другом месте, чтобы мне это действительно нужно?
Каким может быть цикл удержания? – openfrog
@openfrog - Этот конкретный блок может не подвергаться наибольшему риску быть циклом сохранения, но тот, с которым я столкнулся, будет блочным наблюдателем для уведомлений (используя NSNotificationCenter's -addObserverForName: object: queue: usingBlock: '). Если вы настроили такого наблюдателя в объекте и ссылаетесь на что-то на 'self', вы настроите цикл, когда объект держится на блоке, и блок удерживает объект. –
После написания этого я понял, что это не лучший пример, потому что dispatch_async() копирует блок, но только до конца метода. Лучшим примером могло бы быть использование NSBlockOperation, поскольку экземпляр такого объекта принадлежит переданному в блоке времени жизни объекта, что делает циклы сохранения более вероятными. –