Почему происходит сбой после освобождения MKMapView, если я его больше не использую? - PullRequest
24 голосов
/ 03 февраля 2010

У меня есть MKMapView. Иногда после того, как мой контроллер вида уволен, я получаю EXC_BAD_ACCESS.

Я включил NSSZombies и похоже на делегата MKMapView - мой контроллер вида! - вызывается, несмотря на освобождение подклассов MKMapView и UIViewController. Я проверил, и мое управление памятью правильно.

Что происходит?

Ответы [ 4 ]

44 голосов
/ 03 февраля 2010

Это из-за способа работы MKMapView.Ожидается операция, поэтому MapKit сохраняет MKMapView, и он еще не был освобожден.Это само по себе не проблема.Проблема заключается в том, что он по-прежнему отправляет сообщения вашему делегату.

Обходной путь прост: как часть очистки контроллера представления установите делегата представления карты на nil, что предотвратит отправку сообщений на MKMapViewit.

Это задокументировано в Справочник по протоколу MKMapViewDelegate :

Перед выпуском объекта MKMapView, для которого вы установили делегат, не забудьте установить делегат этого объектасобственность на ноль.Единственное место, где вы можете сделать это, - это метод dealloc, где вы избавляетесь от вида карты.

Редактировать: Поднимите также Оскара, чуть ниже, который предоставил цитату документации здесь.

Учитывая ARC, я полагаю, это означает, что вы должны установить делегат вашего вида карты на nil в контроллере вашего вида dealloc.

18 голосов
/ 21 ноября 2011

ОК, это подтверждение ответа. Это из документа Apple, но он отсутствует в MKMapView. Он находится только в документации по протоколу делегата:

Перед выпуском объекта MKMapView, для которого вы установили делегат, не забудьте установить свойство делегата этого объекта на ноль. Один место, где вы можете сделать это в методе dealloc, где вы избавляетесь от вид карты.

ПРИМЕЧАНИЕ. Это также относится к UIWebView.

Я установил указатель делегата MapView равным nil в методе dealloc делегата, и наши сбои, похоже, были устранены.

2 голосов
/ 02 сентября 2011

Установка делегата вида карты на nil не работает для меня. Тем не менее, установка showsUserLocation=NO для делегата сработала, убедившись, что обновления местоположения не получены.

0 голосов
/ 21 мая 2015

Проблема, в моем случае, заключалась в том, что при первом запуске приложения я не нажимаю «разрешить» при запросе авторизации местоположения (случайно !!).

Удаление приложения и его повторная установка, когда появляется подсказка, я разрешаю авторизацию и больше не произойдет сбой!

...