更好的版本
__strong typeof(self) strongSelf = weakSelf;
在你的代码块中,将弱引用作为第一行创建一个强引用。如果self在代码块开始执行时仍然存在且没有回退到nil,则此行确保它在整个代码块的执行期间持续存在。
因此,整个过程应该像这样:
__weak typeof(self) weakSelf = self;
[player addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(0.1, 100)
queue:nil
usingBlock:^(CMTime time) {
__strong typeof(self) strongSelf = weakSelf;
if (strongSelf) {
[strongSelf.timerDisp setText:[NSString stringWithFormat:@"%02d:%02d",min,current]];
} else {
}
}];
我已经多次阅读了这篇文章。这是由 Erica Sadun 撰写的一篇关于如何在使用块和NSNotificationCenter时避免问题的优秀文章。
Swift更新:
例如,在Swift中,一个带有成功块的简单方法将是:
func doSomeThingWithSuccessBlock(success: () -> ()) {
success()
}
当我们调用这个方法并需要在成功的回调中使用self
时,我们将会使用[weak self]
和guard let
特性。
doSomeThingWithSuccessBlock { [weak self] () -> () in
guard let strongSelf = self else { return }
strongSelf.gridCollectionView.reloadData()
}
这种所谓的强弱舞蹈是流行的开源项目 Alamofire
使用的。
更多信息请查看swift-style-guide。
timerDisp
是该类的一个属性吗? - Timplayer(AVPlayer对象)
和timerDisp(UILabel)
? - Carl Veazey