tak, że jest poprawna, z kilkoma wyjątkami:
zachować tylko cykl się dzieje, jeśli self
kończy zachowując blok pośredni, np ustawienie właściwości myblock
na własność od self
myproperty
:
self.myproperty.myblock = ^{ [self dosomething]; }; // ERROR: Retain Cycle
jednak zachować cykl nie (zazwyczaj) zdarzyć podczas korzystania z bloków na coś takiego kodu wysyłki, tak:
dispatch_async(dispatch_get_main_queue(), ^{ [self dosomething]; }); // Safe, dispatch_async will not be retained by you
ile oczywiście Wywołujesz funkcję dispatch_async
wewnątrz bloku, który ma kryteria bycia cyklem zatrzymania.
To jest naprawdę zagmatwane i jest to coś, co mam nadzieję zostanie naprawione. Teraz, dla własnej opinii:
Nie zawsze był to przypadek, w pre-ARC kodem to nie był problem, ale od teraz blokuje automatycznie zachowują żadnych przedmiotów złapią, to problemem.
Życzę, aby to się naprawiło, ponieważ byłaby to łatwa łatka, ponieważ ma numer self
zamiast __weak instancetype const
zamiast instancetype const
. Rozwiązałoby to również pewne problemy z tworzeniem klastrów klas w ARC, co prawda nie jest największym z problemów, ale nadal istnieje.
Jeśli chodzi o zachowanie cykli, nie ma ich wiele.
Cykl zatrzymania nie jest ściśle błędem - często właściciel bloku może pozbyć się tego bloku przed jego zniszczeniem, przerwaniem cyklu i uniknięciem jakiegokolwiek problemu. –
Czy można bezpiecznie stworzyć słabe odniesienie do samego siebie i zawsze używać tego słabego odniesienia wewnątrz bloku, tylko po to, aby nie zachować cyklu zatrzymania? (Zakładając, że jestem w porządku z możliwością, że kiedy blok zostanie wykonany, selfWeak może być wskaźnikiem zerowym?) –
@WiseShepherd oczywiście, w ten sposób naprawiasz cykle zatrzymania w większości sytuacji. –