MapKit/Location Manager аварийно завершает работу приложения при выгрузке вида

У меня есть ошибка, из-за которой мое приложение вылетало «EXC_BAD_ACCESS», когда я нажимал клавишу «Назад» на панели навигации, и представление выгружалось с MapKit (mapView) и использовало диспетчер местоположения. В течение нескольких дней пытался исправить ошибку и, наконец, придумал исправление для всех, кто сталкивается с этой проблемой:

Добавьте этот код в свой Dealloc

- (void)dealloc {
    mapView.delegate = nil;
    locationManager.delegate = nil;

    [mapView release];
    [locationManager release];
}

person AppGolfer    schedule 25.03.2010    source источник
comment
Спасибо чувак! Странно то, что вы не можете воспроизвести это в симуляторе.   -  person Johannes Fahrenkrug    schedule 20.07.2010
comment
Пожалуйста, предоставьте более подробную информацию о реализации. Похоже на какой-то объект. уже выпущен. Кстати, это хорошая привычка обнулять делегата в Dealloc.   -  person kompozer    schedule 29.05.2011
comment
Не видя аварийных журналов, ничего не скажешь. Но похоже, вы выпускаете что-то дважды. попробуйте добавить NSZombieEnabled, это скажет вам, пытаетесь ли вы получить доступ к чему-то в памяти, которая уже была освобождена.   -  person CW0007007    schedule 31.01.2012


Ответы (1)


У меня тоже было такое :) И, да, это исправление на самом деле правильное исправление;

- (void)dealloc {
  mapView.delegate = nil;
  locationManager.delegate = nil;

  [mapView release];
  [locationManager release];
}

Что происходит за кулисами, так это:

  1. Вы нажимаете клавишу «бэк». Это выгружает и, как следствие, освобождает контроллер, который содержит mapView. Поскольку вполне вероятно, что была только одна ссылка на контроллер, он будет освобожден.

  2. Однако на locationManager, вполне вероятно, все еще ссылаются где-то во внутренней работе геопозиционирования.

  3. Если locationManager и/или mapView теперь отправляют уведомление своему соответствующему делегату, они следуют недопустимому указателю. Что приведет к исключению EXC_BAD_ACCESS.

Да: обнуление делегатов, указывающих на себя, всегда хорошая идея. Я просто хотел, чтобы Apple добавила туда немного автомагии.

person radiospiel    schedule 18.02.2012