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];
    }
Author: Enzo Tran, 2013-06-14

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.

 19
Author: George Karpenkov,
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) {
        ...
    }
}];
 60
Author: Gianluca Tranchedone,
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