Скажем, у меня есть следующий метод внутри подкласса 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];
}
});
}];
}
Но я нахожу это неразумно уродливым и хотел бы избежать этого, если это не нужно.