Mike Ash has written this introduction to ARC gdzie wprowadza coś takiego:Kiedy i dlaczego chcę zadeklarować zmienną lokalną jako __weak przy użyciu ARC?
__weak Foo *_weakFoo = [object foo];
Dlaczego miałbym to zrobić, dla zmiennej czasowej lokalnym? __weak to odwołanie do zerowania, które automatycznie ustawia wskaźnik _weakFoo na zero, gdy tylko obiekt referencyjny zostanie zwolniony. Również __weak jest dostępna tylko w iOS> = 5.
Kiedy chciałbym popaść w kłopoty, kiedy po prostu to zrobić ?:
Foo *_weakFoo = [object foo];
To jest zawsze oczekuje się zwrócić obiekt lub zerowa. Moje przypuszczenie jest takie:
Foo *_weakFoo = [object foo];
[self doSomethingStupid]; // does something bad so foo gets deallocated
[_weakFoo doIt]; // CRASH! msg sent to deallocated instance 0x123456
Jedną rzeczą, która nadal robaki mnie z łuku jest: Kiedy to wiem, że nie muszę już obiekt? Twierdzę, że kiedy ustawiam wskaźnik na zero lub coś innego, to odkryje on, że obiekt, do którego wcześniej się odwołał, nie jest już potrzebny temu właścicielowi i dlatego może odejść. Ale chodzi o to, że ustawiłem go na zero. Więc i tak jest zero!
Więc kiedy zmienilibyśmy lokalną zmienną __, co za szalona rzecz, muszę zrobić gdzie indziej, że naprawdę tego potrzebuję?
Co jednak może być cykl zatrzymania? – openfrog
@openfrog - Ten konkretny blok może nie być narażony na największe ryzyko bycia cyklem zatrzymania, ale taki, na którym natrafiłem, byłby blokowym obserwatorem dla powiadomień (za pomocą '-addObserverForName NSNotificationCenter: object: queue: usingBlock:'). Jeśli ustawisz takiego obserwatora w obiekcie i odniesiesz się do czegoś na "ja", ustawisz cykl, gdy obiekt będzie trzymał się bloku, a blok będzie trzymał się tego obiektu. –
Po napisaniu tego zdałem sobie sprawę, że nie jest to najlepszy przykład, ponieważ dispatch_async() kopiuje blok, ale tylko do końca metody. Lepszym przykładem byłoby użycie NSBlockOperation, ponieważ instancja takiego obiektu przechodzi przez blok życia przez cały okres istnienia obiektu, co sprawia, że cykle zatrzymania są bardziej prawdopodobne. –