РЕДАКТИРОВАТЬ: изменил название. Я не знал этого в то время, но это дубликат Почему я вылетал после освобождения MKMapView, если я больше не использую его?
<Ч />
Этот вопрос похож на Почему объект не освобождается при использовании ARC + NSZombieEnabled , но настолько отличается, что я подумал, что его стоит выбросить, если кто-то поймет и сможет объяснить мне, что происходит. Другим вопросом может быть ошибка XCode, поэтому я предполагаю, что это может быть похоже.
Сценарий:
RootViewController
имеет tableView
, отображающий кучу предметов
- Выбор ячейки представляет модальное значение
detailViewController
, содержащее еще один tableView
- Одна из ячеек таблицы в
detailViewController
содержит MKMapView
, показывающий местоположение элемента
mapView.delegate = detailViewController
- Отклонить модал
detailViewController
Вскоре после этого происходит сбой приложения из-за того, что MKMapView
отправляет mapView:viewForAnnotation:
в уже освобожденный detailViewController
. Этот сбой воспроизводился на пользовательском устройстве со специальной сборкой дистрибутива, поэтому проблема не имеет ничего общего с NSZombieEnabled
.
Мне удалось устранить ошибку, добавив:
_mapView.delegate = nil;
к dealloc
методу tableViewCell
, содержащему mapView.
ВОПРОС: почему необходимо обнулить делегата, когда ячейка освобождается? Кажется, что ARC должен освобождать mapView
, когда ячейка освобождается, оставляя это ненужным. Это хорошая практика, чтобы ноль делегатов, но я не думал, что это потребуется в этом случае.
РЕДАКТИРОВАТЬ: все подпредставления как detailViewController
, так и UITableViewCells
объявлены как (nonatomic, strong)
свойства ala:
@property (nonatomic, strong) MKMapView * mapView;
РЕДАКТИРОВАТЬ 2: Думаю, мне нужно лучше читать документы. @fluchtpunkt правильно. Вот соответствующая информация из MKMapView
документации:
Перед выпуском объекта MKMapView, для которого вы установили
делегат, не забудьте установить свойство делегата этого объекта на ноль. Один
место, где вы можете сделать это в методе dealloc, где вы избавляетесь от
вид карты.