Кога и защо бих искал да декларирам локална променлива като __слаба с помощта на ARC?

Майк Аш е написал това въведение към 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 за локална променлива има смисъл и какво лудо нещо трябва да направя някъде другаде, за да имам наистина нужда от това?


person openfrog    schedule 10.01.2012    source източник


Отговори (1)


да нещо като това, което е достъпно в цялата навигация
person Mark Adams    schedule 10.01.2012
comment
Как обаче може да има цикъл на задържане? - person openfrog; 10.01.2012
comment
@openfrog - Този конкретен блок може да не е изложен на най-голям риск да бъде цикъл на запазване, но такъв, с който се сблъсках, би бил базирани на блок наблюдатели за известия (използвайки -addObserverForName:object:queue: usingBlock: на NSNotificationCenter). Ако настроите такъв наблюдател в обект и се обърнете към нещо на self, вие ще настроите цикъл, тъй като обектът се придържа към блока и блокът се придържа към обекта. - person Brad Larson; 11.01.2012
comment
След като написах това, осъзнах, че това не е най-добрият пример, защото dispatch_async() копира блока, но само до края на метода. По-добър пример би бил използването на NSBlockOperation, тъй като екземпляр на такъв притежава предадения блок за живота на обекта, което прави циклите на запазване по-вероятни. - person Mark Adams; 11.01.2012