Майк Аш е написал това въведение към ARC където той въвежда нещо като:
__weak Foo *_weakFoo = [object foo];
Защо бих искал да направя това за локална, временна променлива? __weak е референция за нулиране, която ще зададе указателя _weakFoo автоматично на нула веднага щом реферираният обект бъде освободен. Освен това __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, е: Кога знае, че вече нямам нужда от обект? Бих казал, че когато задам указател на нула или на нещо друго, той установява, че посоченият преди това обект вече не е необходим на този собственик и следователно може би може да изчезне. Но въпросът е: поставих го на нула. Така че все пак е нула!
И така, кога __weak за локална променлива има смисъл и какво лудо нещо трябва да направя някъде другаде, за да имам наистина нужда от това?