Odnosi się do słabego JA wewnątrz zagnieżdżonego bloku
Załóżmy, że już stworzyłem słabą jaźń używając
__weak typeof(self) weakSelf = self;
[self doABlockOperation:^{
...
}];
Wewnątrz tego bloku, jeśli zagnieżdżę inny blok:
[weakSelf doAnotherBlockOperation:^{
[weakSelf doSomething];
}
Czy stworzy cykl zachowawczy? Czy muszę tworzyć kolejne słabe odniesienie do słabego siebie?
__weak typeof(self) weakerSelf = weakSelf;
[weakSelf doAnotherBlockOperation:^{
[weakerSelf doSomething];
}
2 answers
To zależy.
Tworzysz cykl zachowywania tylko wtedy, gdy rzeczywiście przechowujesz blok (ponieważ self
wskazuje na blok, A Blok wskazuje na self
). Jeśli nie zamierzasz przechowywać żadnego z bloków, użycie silnego odniesienia do self
jest wystarczająco dobre - - - blok zostanie wydany najpierw po jego wykonaniu, a następnie zwolni jego wskaźnik do self
.
W twoim konkretnym przykładzie, chyba że wykonujesz więcej operacji, które nie są pokazane, nie musisz tworzyć żadnych weakerWeakerEvenWeakerSelfs.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-14 09:22:13
Twój kod będzie działał poprawnie: słabe odniesienie nie spowoduje cyklu zachowywania, ponieważ wyraźnie instruujesz ARC, aby nie zwiększać liczby zatrzymań słabego obiektu. Dla najlepszej praktyki należy jednak stworzyć silne odniesienie do obiektu za pomocą słabego. Nie utworzy to również cyklu zachowywania, ponieważ silny wskaźnik w bloku będzie istniał tylko do zakończenia bloku(jego jedynym zakresem jest sam blok).
__weak typeof(self) weakSelf = self;
[self doABlockOperation:^{
__strong typeof(weakSelf) strongSelf = weakSelf;
if (strongSelf) {
...
}
}];
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-27 13:22:38