Майк Эш написал это введение в ARC, где он вводит что-то вроде:
__weak Foo *_weakFoo = [object foo];
Зачем мне делать это для локальной временной переменной? __weak — это обнуляющая ссылка, которая автоматически устанавливает указатель _weakFoo на nil, как только объект, на который указывает ссылка, освобождается. Кроме того, __weak доступен только в iOS >= 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, это: когда он узнает, что мне больше не нужен объект? Я бы сказал, что когда я устанавливаю указатель на nil или на что-то еще, он выясняет, что ранее указанный объект больше не нужен этому владельцу и, следовательно, может уйти. Но дело в том, что я установил его на ноль. Так что все равно ноль!
Итак, когда __weak для локальной переменной имеет смысл, и что за безумие я должен сделать где-то еще, чтобы оно мне действительно понадобилось?