2012-09-11 16 views
5

Mam trochę problemów z myśleniem o sobie wewnątrz bloku, a nie tworzeniem cyklu zatrzymania.bloki, self, zatrzymywanie cykli

Czy możesz dać mi znać, jeśli moje rozumienie jest poprawne:

Jeśli kiedykolwiek odwołać siebie w bloku, to stworzyć cykl zatrzymania, a zamiast tego należy tworząc słaby odniesienie do siebie na zewnątrz bloku a następnie używając tego słabego odniesienia wewnątrz bloku?

Dzięki!

Odpowiedz

11

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 selfmyproperty:

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.

+1

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. –

+0

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?) –

+0

@WiseShepherd oczywiście, w ten sposób naprawiasz cykle zatrzymania w większości sytuacji. –