Widziałem następuje używane:Dlaczego nie powinienem używać słabego wskaźnika do siebie w bloku przekazanym do dispatch_after()?
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
//code to be executed on the main queue after delay
[self doSometingWithObject:obj1 andAnotherObject:obj2];
});
Ale nie powinno używać słaby siebie w bloku?
__weak typeof(self) weakSelf = self;
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
//code to be executed on the main queue after delay
[weakSelf doSometingWithObject:obj1 andAnotherObject:obj2];
});
Jestem nowicjuszem dla GCD i bloków i staram się wypracować jak najbardziej poprawne użycie. Wielkie dzięki za wskazówki na ten temat.
To zależy. Czy potrzebujesz wywołania 'doSometingWithObject' [sic] nawet po wyłączeniu kontrolera widoku, czy nie? Czasem robisz (np. Być może coś zapisujesz, aktualizujesz obiekt modelu, publikujesz ważne żądanie sieciowe, cokolwiek), w takim przypadku użyjesz poprzedniej składni. Ale czasami tego nie robisz (np. Chcesz zaktualizować jakiś obiekt interfejsu użytkownika w widoku, który mógł już zostać odrzucony), w takim przypadku użyjesz tego ostatniego. – Rob
To zależy od tego, co chcesz zrobić, jeśli 'self' ma szansę zostać zwolniony, zanim opóźnienie się skończy. Pierwszy fragment uniemożliwiłby to, więc wywołanie w bloku zawsze miało miejsce, gdy drugie pozwoliłoby na zwolnienie siebie, a blok nie zrobiłby nic. Zwykle słabe ja stosuje się do zapobiegania cyklom zatrzymania, ale nie ma cyklu zatrzymania w tym bloku w żaden sposób – dan