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.
__block _weak NSString *strEg;
?apple docs
źródło
Oprócz innych odpowiedzi na temat
__block
vs__weak
, istnieje inny sposób uniknięcia cyklu utrzymania w scenariuszu.@weakify(self); [self methodThatTakesABlock:^ { @strongify(self); [self doSomething]; }];
Więcej informacji o @Weakify @Strongify Macro
źródło
Używając self w bloku, należy używać __weak , a nie __block, ponieważ może to zachować siebie.
Jeśli potrzebujesz silnej jaźni, możesz użyć tego:
__weak typeof(self) *weakSelf = self; [self methodThatTakesABlock:^{ if (weakSelf) { __strong typeof(self) *strongSelf = weakSelf; [strongSelf doSomething]; } }];
źródło