より良いバージョン
__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 を使用する際の問題を回避する方法に関する優れた記事です。
迅速な更新:
たとえば、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 をチェックしてください