Czy taniec weakSelf / strongSelf jest naprawdę niezbędny podczas odwoływania się do self wewnątrz nie zatrzymanego zakończenia wywoływanego z UIViewController?
Powiedz, że mam w środku następującą metodęUIViewController
podklasa:
- (void)makeAsyncNetworkCall
{
[self.networkService performAsyncNetworkCallWithCompletion:^{
dispatch_async(dispatch_get_main_queue(), ^{
[self.activityIndicatorView stopAnimating];
}
});
}];
}
Wiem, że odniesienie doself
wewnątrz bloku daje wynikUIViewController
przykład zatrzymany przez blok. Tak długo jakperformAsyncNetworkCallWithCompletion
nie przechowuje bloku we właściwości (lub ivar) na moimNetworkService
, mam rację, myśląc, że nie ma cyklu zatrzymania?
Zdaję sobie sprawę, że powyższa struktura doprowadzi do zachowania UIViewController doperformAsyncNetworkCallWithCompletion
kończy się, nawet jeśli wcześniej został zwolniony przez system. Ale prawdopodobnie (a nawet możliwe?) System zwolni mojeUIViewController
w ogóle (po zmianach w sposobie zarządzania iOS 6UIViewController
wsparcieCALayer
pamięć)?
Jeśli istnieje powód, dla którego muszę wykonać „słaby taniec / silny taniec”, wyglądałoby to tak:
- (void)makeAsyncNetworkCall
{
__weak typeof(self) weakSelf = self;
[self.networkService performAsyncNetworkCallWithCompletion:^{
typeof(weakSelf) strongSelf = weakSelf;
if (!strongSelf) {
return;
}
dispatch_async(dispatch_get_main_queue(), ^{
[strongSelf.activityIndicatorView stopAnimating];
}
});
}];
}
Ale uważam to za nieprzyjemnie brzydkie i chciałbym tego uniknąć, jeśli nie jest to konieczne.