Почему я врезаться после MKMapView не освобождается, если я больше не использовать его?

голоса
23

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

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

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

Задан 02/02/2010 в 23:10
источник пользователем
На других языках...                            


4 ответов

голоса
43

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

Чтобы обойти эту проблему просто: Как часть очистки вашей точки зрения контроллера установить делегат вид карты, чтобы nil, которая предотвратит MKMapViewотправку сообщений на него.

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

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

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

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

Ответил 02/02/2010 в 23:18
источник пользователем

голоса
18

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

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

Примечание: Это относится также к UIWebView.

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

Ответил 20/11/2011 в 22:20
источник пользователем

голоса
2

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

Ответил 02/09/2011 в 17:57
источник пользователем

голоса
0

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

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

Ответил 21/05/2015 в 15:11
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more