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
selfw bloku, blok tworzy silne odniesienie do blokuself, więc jeśliselfma 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
__weaki__blockdo zmiennej, blok nie zapewni, że zostanie on utrzymany.
Więc jestem całkowicie zdziwiony.