更好的版本
__strong typeof(self) strongSelf = weakSelf;
创建对该弱版本的强引用作为块中的第一行。如果当块开始执行时 self 仍然存在并且没有回退到零,则此行确保它在整个块的执行生命周期中持续存在。
所以整个事情会是这样的:
// Establish the weak self reference
__weak typeof(self) weakSelf = self;
[player addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(0.1, 100)
queue:nil
usingBlock:^(CMTime time) {
// Establish the strong self reference
__strong typeof(self) strongSelf = weakSelf;
if (strongSelf) {
[strongSelf.timerDisp setText:[NSString stringWithFormat:@"%02d:%02d",min,current]];
} else {
// self doesn't exist
}
}];
我已经多次阅读这篇文章。这是Erica Sadun撰写的一篇关于
如何在使用块和 NSNotificationCenter 时避免问题的优秀文章
快速更新:
例如,在 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