更好的版本
__strong typeof(self) strongSelf = weakSelf;
在该块的第一行中创建对该弱版本的强引用。如果在块开始执行时self仍然存在,并且还没有回到nil,那么此行将确保它在整个块的执行生命周期中持续存在。
所以整个事情是这样的:
// 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时避免出现问题
快速更新:
例如,快速地使用成功块的简单方法是:
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
在类的属性?