Czytam dokumentację Xcode i jest coś, co mnie zastanawia:
__block typeof(self) tmpSelf = self;
[self methodThatTakesABlock:^ {
[tmpSelf doSomething];
}];
Z dokumentacji skopiowano:
Blok stanowi silne odniesienie do przechwytywanych zmiennych. Jeśli używasz
self
w bloku, blok tworzy silne odniesienie do blokuself
, więc jeśliself
ma również silne odniesienie do bloku (co zwykle ma), powstaje silny cykl odniesienia. Aby uniknąć cyklu, musisz utworzyć słabe (lub__block
) odniesienie do siebie poza blokiem, jak w powyższym przykładzie.
Nie rozumiem, co oznacza „słaby (lub __block
)”?
Jest
__block typeof(self) tmpSelf = self;
i
__weak typeof(self) tmpSelf = self;
dokładnie to samo tutaj?
W dokumencie znalazłem inny kawałek:
Uwaga: w środowisku zbierania elementów bezużytecznych, jeśli zastosujesz zarówno modyfikatory, jak
__weak
i__block
do zmiennej, blok nie zapewni, że zostanie on utrzymany.
Więc jestem całkowicie zdziwiony.