私はまだobjective-cのブロックには新しく、この擬似コードが正しいかどうか疑問に思っています。私はそれだけでオブザーバを削除するか、私はremoveObserverを呼び出す必要がある場合には十分だかはわからない:名前:オブジェクト:addObserverForNameの正しい管理:オブジェクト:キュー:usingBlock:
-(void) scan {
Scanner *scanner = [[Scanner alloc] init];
id scanComplete = [[NSNotificationCenter defaultCenter] addObserverForName:@"ScanComplete"
object:scanner
queue:nil
usingBlock:^(NSNotification *notification){
/*
do something
*/
[[NSNotificationCenter defaultCenter] removeObserver:scanComplete];
[scanner release];
}];
[scanner startScan];
}
アップデート:私はこのブロックからの断続的なEXC_BAD_ACCESS
を受けていますので、これをすることはできません右。
あなたは '__block id scanComplete;'が必要です。そうしないとブロックにコピーされ、オブザーバが漏れてしまいます。 – hwaxxer
ARCの世界では、キャプチャを避けるために '__block'を使用するコメントはもはや真実ではありません。 _does_が真であることは、 '__block'修飾子が基本的な問題を修正したことです:ブロックが定義されているとき、' addObserverForName:...'はまだ返されていないので、捕捉される値は、(変数宣言の暗黙的なauto-nilのためにARCの下で実行されているとき)最高でnilであるか、または**未定義**で、完全に未定義の振る舞いについてBAD_ACCESS 、最悪の場合... – danyowdee
ブロック内のローカル変数を参照してオブザーバを削除することは、常にskankyでした。返されたオブザーバトークン(ここでは 'scanComplete')をインスタンス変数として格納します。 ARCの下では、これは '__weak'インスタンス変数でなければなりません。 – matt