Действительно ли необходим танец strongSelf / strongSelf, когда ссылается на себя внутри несохраненного завершения, вызываемого из UIViewController?
Скажем, у меня есть следующий метод внутриUIViewController
подкласс:
- (void)makeAsyncNetworkCall
{
[self.networkService performAsyncNetworkCallWithCompletion:^{
dispatch_async(dispatch_get_main_queue(), ^{
[self.activityIndicatorView stopAnimating];
}
});
}];
}
Я знаю что ссылка наself
внутри блока приводит кUIViewController
экземпляр сохраняется в блоке. Так долго какperformAsyncNetworkCallWithCompletion
не хранит блок в свойстве (или ivar) на моемNetworkService
Я прав, думая, что нет цикла сохранения?
Я понимаю, что приведенная выше структура приведет к сохранению UIViewController доperformAsyncNetworkCallWithCompletion
заканчивается, даже если он был выпущен системой ранее. Но вполне вероятно (или даже возможно?) Система освободит моюUIViewController
вообще (после изменений в способе iOS 6 управляетUIViewController
бэкCALayer
Память)?
Если есть причина, по которой я должен выполнить «танец слабого себя / сильного себя», это будет выглядеть так:
- (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];
}
});
}];
}
Но я считаю это безобразно некрасивым и хотел бы избежать этого, если в этом нет необходимости.