假设我在子类中有以下方法UIViewController
:
- (void)makeAsyncNetworkCall
{
[self.networkService performAsyncNetworkCallWithCompletion:^{
dispatch_async(dispatch_get_main_queue(), ^{
[self.activityIndicatorView stopAnimating];
}
});
}];
}
我知道self
对块内部的引用导致UIViewController
实例被块保留。只要performAsyncNetworkCallWithCompletion
不将块存储在 my 上的属性(或 ivar)中NetworkService
,我认为没有保留周期是否正确?
我意识到上面的这个结构会导致 UIViewController 被保留直到performAsyncNetworkCallWithCompletion
完成,即使它被系统提前释放。但它有可能(甚至可能吗?)系统会完全取消分配 my (UIViewController
在iOS 6 管理 aUIViewController
的后备CALayer
内存的方式发生变化之后)?
如果有理由我必须做“weakSelf/strongSelf dance”,它看起来像这样:
- (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];
}
});
}];
}
但我觉得这非常丑陋,如果没有必要,我想避免它。