5

オブジェクトがデリゲートにメッセージを送信しようとし、デリゲートがすでに解放されているときに、アプリの1つでクラッシュが発生したことに最近気づきました。

現時点では、デリゲートメソッドを呼び出す直前に、次のチェックを実行します。

if (delegate && [delegate respondsToSelector:...]){
   [delegate ...];
}

しかし、明らかに、これは、デリゲートがnilでない場合は考慮されませんが、割り当てが解除されています。

デリゲートのメソッドでオブジェクトのデリゲートをnilに設定する以外に、オブジェクトdeallocへの参照がなくなった場合に備えて、デリゲートがすでに解放されているかどうかを確認する方法はありますか。

4

4 に答える 4

16

いいえ。変数が有効なオブジェクトを指しているかどうかを判断する方法はありません。このオブジェクトのデリゲートが最初に通知せずに消えないように、プログラムを構造化する必要があります。

于 2010-06-02T00:39:30.003 に答える
8

GCを使用していないと思います。その場合、標準的な規則では、デリゲートを設定するコードは、デリゲートの割り当てを解除する前に、デリゲートユーザーの参照を設定する責任nilがあります。GCを使用している場合は__weak、デリゲートの参照を使用して、ガベージコレクターがnilインスタンスがガベージコレクションされるときに参照を設定できるようにすることができます。

于 2010-06-02T00:43:15.960 に答える
0

割り当てるたびにインクリメントし、deallocするたびにデクリメントするカウンターを使用するのはどうですか。そうすれば、二重割り当てを検出でき、カウンターがnilではなく、アドレスもnilでない場合に、デリゲートを使用しないことを決定できます。

于 2010-06-02T00:36:30.267 に答える
0

デバッグが提案する場合、クラスの release メソッドをオーバーライドして、いつ呼び出されるかを確認できます。

-(oneway void)release
{
    NSLog(@"release called");
    [super release];
}
于 2013-04-09T21:38:36.253 に答える