私は持っていMKMapView
ます。ビューコントローラーが閉じられた後、EXC_BAD_ACCESS
.
オンにすると、のデリゲートのNSSZombies
ように見えます—私のビューコントローラーです! — サブクラスとサブクラスの両方が解放されているMKMapView
にもかかわらず、呼び出されています。確認しましたが、メモリ管理は正しいです。MKMapView
UIViewController
どうしたの?
私は持っていMKMapView
ます。ビューコントローラーが閉じられた後、EXC_BAD_ACCESS
.
オンにすると、のデリゲートのNSSZombies
ように見えます—私のビューコントローラーです! — サブクラスとサブクラスの両方が解放されているMKMapView
にもかかわらず、呼び出されています。確認しましたが、メモリ管理は正しいです。MKMapView
UIViewController
どうしたの?
これはMKMapView
仕組みによるものです。保留中の操作があるため、MapKit は を保持しMKMapView
ており、実際にはまだ割り当てが解除されていません。それ自体は問題ではありません。問題は、まだデリゲートにメッセージを送信していることです。
回避策は簡単です。View Controller のクリーンアップの一環として、マップ ビューのデリゲートを に設定しますnil
。これによりMKMapView
、メッセージが送信されなくなります。
これはMKMapViewDelegate プロトコル リファレンスに記載されています。
デリゲートを設定した MKMapView オブジェクトを解放する前に、そのオブジェクトのデリゲート プロパティを nil に設定することを忘れないでください。これを行うことができる 1 つの場所は、マップ ビューを破棄する dealloc メソッドです。
編集:ここでドキュメントの引用を提供したオスカーにも、すぐ下に賛成票を投じてください。
ARC を考えると、これは、マップ ビューのデリゲートをnil
ビュー コントローラーの に設定する必要があることを意味することをお勧めしますdealloc
。
OK、これは答えの確認です。Apple doc からのものですが、MKMapView にはありません。デリゲート プロトコルのドキュメントでのみ見つかります。
デリゲートを設定した MKMapView オブジェクトを解放する前に、そのオブジェクトのデリゲート プロパティを nil に設定することを忘れないでください。これを行うことができる 1 つの場所は、マップ ビューを破棄する dealloc メソッドです。
注: これは UIWebView にも適用されます。
デリゲートの dealloc メソッドで MapView のデリゲート ポインターを nil に設定したところ、クラッシュは解消されたようです。
マップ ビューのデリゲートを設定してnil
もうまくいきませんでした。ただし、showsUserLocation=NO
デリゲートの設定は、場所の更新が受信されないようにすることで機能しました。