より良いバージョン
__strong typeof(self) strongSelf = weakSelf;
ブロックの最初の行として、その弱いバージョンへの強い参照を作成します。ブロックが実行を開始したときにまだ自己が存在し、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を使用するときに問題を回避する方法に関する
優れた記事です。
迅速な更新:
たとえば、swiftでは、successブロックを使用した単純なメソッドは次のようになります。
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
クラスのプロパティには?