1

私はARCとiOS5用に設計されたライブラリを持っていましたが、顧客はiOS4.x用に構築したいと考えていました。修飾子を使用してプロパティをに変換しましたが、メモリの破損が発生しているようですweak-esqがクラッシュします。unsafe_unretainedクラッシュの場合、私はこのようなデリゲートプロパティを持っています

@property (unsafe_unretained) id<MYDelegateProtocol> delegate;

そして私@synthesizeはivarです。

デリゲートでメソッドを呼び出したいときはいつでも、そうであるかどうかを確認し、そうnilでない場合はメソッドを呼び出します。そのプロトコルにはオプションのメソッドがないため、チェックしませんrespondsToSelector

しかし、に変更してweakからunsafe_unretained、どうやら参照が消えて、ダングリングポインタが残っていることがわかりました。ObjC Exceptions(認識されないメッセージの場合)にブレークポイントを設定し、次にpoオブジェクトのアドレスを設定すると、デリゲートのプロトコルを実装していないオブジェクトであることがわかります。もちろん、クラッシュします。

使用するときunsafe_unretainedに、参照が「なくなった」ことをどのように知ることができますか?私のコードは、以前にゼロ化されたポインターに依存していました。

4

3 に答える 3

2

オブジェクトの所有権に問題があります。リリースされたオブジェクトはnilではなく、オブジェクトがあったアドレスを指しているだけです。nilポインタは0x0を指します。委任されているレコードが有効である間に、アーキテクチャに委任が解放されている理由を分析する必要があります。特別な状況では、委任されているオブジェクトが委任を保持する場合があります(NSURLConnectionなど)。その他の場合、委任されているオブジェクトはその委任のプロパティです。その場合、割り当てを解除する前に委任をクリアする必要があります。パターンを分析したり、詳細情報を提供したりします。

于 2012-09-25T18:04:07.057 に答える
2

私がiOSWeakForwarderを開発したこのクラスを試してください

于 2014-03-27T17:54:06.750 に答える
1

unsafe_unretainedを使用している場合、参照が「なくなった」ことをどのように知ることができますか?私のコードは、以前にゼロ化されたポインターに依存していました。

これは、コンパイル時にユーザーが決定する必要があります。多くの場合、委任であるオブジェクトは、delegateそのオブジェクトに委任するオブジェクトのプロパティをメソッドnilで設定する必要があります。dealloc例えば:

- (void)dealloc
{
    if (_httpRequest.delegate == self)
        _httpRequest.delegate = nil;
}

お役に立てれば!

于 2012-09-25T18:03:34.683 に答える