時々クラッシュするメソッドがあります。
-(void)foo{
[self doSomething];
[self.delegate didFinish];
[self doSomethingElse];
}
-doSomething が正しく機能したら、デリゲート -didFinish を呼び出します。-didFinish 内で、このオブジェクトへの参照が nil に設定され、ARC で解放される場合があります。メソッドがクラッシュすると、-doSomethingElse でクラッシュします。私の仮定は、メソッド内で self が強力であり、関数が完了することを可能にするというものでした。自分は弱いか強いか?これに関するドキュメントはありますか?それが強いか弱いかの理由は何でしょうか?
編集
以下の回答のいくつかに触発されて、私はいくつかの調査を行いました。私の場合のクラッシュの実際の原因は、NSNotificationCenter がオブザーバーを保持していないことです。Mike Weller は、上記のケースを防ぐために、メソッドの呼び出し元が呼び出し中のオブジェクトを保持する必要があることを以下に示していますが、NSNotificationCenter はこの問題を無視し、オブザーバーへの弱い参照を常に維持しているようです。言い換えると:
-(void)setupNotification{
//observer is weakly referenced when added to NSNotificationCenter
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleNotification:)
name:SomeNotification object:nil];
}
//handle the notification
-(void)handleNotification:(id)notification{
//owner has reference so this is fine
[self doSomething];
//call back to the owner/delegate, owner sets reference to nil
[self.delegate didFinish];
//object has been dealloc'ed, crash
[self doSomethingElse];
}