メソッド呼び出しの進行中であってもオブジェクトの割り当てが解除される可能性があることを考えると (リンク) *、オブジェクトが登録して、予想されるスレッドとは異なるスレッドで配信される通知を受け取ることは安全ですか?割り当て解除?
参考までに、ドキュメントには次のように記載されています
マルチスレッド アプリケーションでは、通知は常に、通知が投稿されたスレッドで配信されます。これは、オブザーバーが自身を登録したスレッドと同じではない場合があります。
また、NSNotificationCenter は、通知を受信するために登録されたオブジェクトへの強い参照を保持しないという事実も重要です。
状況をより具体的にする例を次に示します。
- (id)init {
self = [super init];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:SomeNotification object:nil];
}
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)handleNotification:(NSNotification *)notification {
// do something
}
この実装を持つオブジェクトは、スレッド X で SomeNotification を受け取ります。
次のように考えるのは正しいですか。
を。-handleNotification: を呼び出す前に NSNotificationCenter がオブジェクトへの強い参照を取得する場合、オブジェクトは -handleNotification: が戻るまで割り当て解除されません。
b. -handleNotification: を呼び出す前に NSNotificationCenter がオブジェクトへの強い参照を取得しない場合、オブジェクトは -handleNotification: が戻る前に割り当て解除される可能性があります。
どちらの方法 (a または b) で機能しますか? このトピックはまだドキュメントに記載されていませんが、マルチスレッド環境で NSNotificationCenter を安全に使用するためには、多少重要なようです。
更新:前述のリンクの回答が更新され、「ARC は弱参照での呼び出しを保持および解放する」ことが示されました。これは、メソッド呼び出しの進行中にオブジェクトの割り当てを解除してはならないことを意味します。