Проблемы с указателем делегата после обновления до ARC
Я только что обновил свое приложение до ARC, но у меня возникли проблемы с обработкой классов с делегатами. Поскольку я нацеливаюсь на iOS 4.0 и выше, я использую __unsafe_unretained
а также @property (unsafe_unretained)
хранить указатели делегатов.
Однако теперь я обнаружил, что службы (которые включают делегатов), которые я создаю в моих контроллерах представления, теперь зависают после того, как я удалил этот контроллер представления, что приводит к попытке связаться с контроллером представления (делегатом) после него. был освобожден... И поэтому получаю ошибку с включенными зомби.
Как я могу обновить свой код либо в контроллере представления, либо в службе, чтобы при удалении контроллера представления (извлечении из стека контроллера nav) служба с указателем делегата также удалялась из памяти?
1 ответ
Оказывается, что не я делаю что-то не так...
Обидевший Н.С.Зомби оказался из-за MKMapViewDelegate
, который продолжает посылать 'mapView: didUpdateUserLocation:' после освобождения контроллера представления, которому он принадлежит. Я знаю.
Я решил это, перехватив кнопку "Назад" в моем контроллере представления, и установил делегат равным нулю, прежде чем выдавать его:
- (void)backButtonTapped
{
self.mapView.delegate = nil;
[self.navigationController popViewControllerAnimated:YES];
}
Я не знаю, почему MapKit держит делегата после того, как он был освобожден. Если кто-нибудь знает, я был бы рад узнать больше.