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