24

私は持っていMKMapViewます。ビューコントローラーが閉じられた後、EXC_BAD_ACCESS.

オンにすると、のデリゲートのNSSZombiesように見えます—私のビューコントローラーです! — サブクラスとサブクラスの両方が解放されているMKMapViewにもかかわらず、呼び出されています。確認しましたが、メモリ管理は正しいです。MKMapViewUIViewController

どうしたの?

4

4 に答える 4

44

これはMKMapView仕組みによるものです。保留中の操作があるため、MapKit は を保持しMKMapViewており、実際にはまだ割り当てが解除されていません。それ自体は問題ではありません。問題は、まだデリゲートにメッセージを送信していることです。

回避策は簡単です。View Controller のクリーンアップの一環として、マップ ビューのデリゲートを に設定しますnil。これによりMKMapView、メッセージが送信されなくなります。

これはMKMapViewDelegate プロトコル リファレンスに記載されています。

デリゲートを設定した MKMapView オブジェクトを解放する前に、そのオブジェクトのデリゲート プロパティを nil に設定することを忘れないでください。これを行うことができる 1 つの場所は、マップ ビューを破棄する dealloc メソッドです。

編集:ここでドキュメントの引用を提供したオスカーにも、すぐ下に賛成票を投じてください。

ARC を考えると、これは、マップ ビューのデリゲートをnilビュー コントローラーの に設定する必要があることを意味することをお勧めしますdealloc

于 2010-02-02T22:18:17.373 に答える
18

OK、これは答えの確認です。Apple doc からのものですが、MKMapView にはありません。デリゲート プロトコルのドキュメントでのみ見つかります。

デリゲートを設定した MKMapView オブジェクトを解放する前に、そのオブジェクトのデリゲート プロパティを nil に設定することを忘れないでください。これを行うことができる 1 つの場所は、マップ ビューを破棄する dealloc メソッドです。

注: これは UIWebView にも適用されます。

デリゲートの dealloc メソッドで MapView のデリゲート ポインターを nil に設定したところ、クラッシュは解消されたようです。

于 2011-11-20T21:20:14.543 に答える
2

マップ ビューのデリゲートを設定してnilもうまくいきませんでした。ただし、showsUserLocation=NOデリゲートの設定は、場所の更新が受信されないようにすることで機能しました。

于 2011-09-02T16:57:32.233 に答える