2009-09-07 3 views
1

У меня возникла проблема с MKMapView/аннотациями/UINavigationController. В основном, я управляю своими представлениями с помощью UINavigationController; одно из моих представлений содержит MKMapView и я добавляю к нему аннотации (от 10 до 200) с помощью метода addAnnotations.addAnnotations issue (возможно, управление памятью?)

Все работает отлично, за исключением одного: если я перемещаюсь «слишком быстро» на моем UINavigationController, симулятор iphone падает, получая сигнал «EXC BAD ACCESS». Например, если я загружаю свой просмотр, содержащий MKMapView, и сразу же нажимаю кнопку «Назад» на панели навигации UINavigationController, я получаю сигнал. Я решил, что проблема связана с методом addAnnotations: когда мой MKMapView загружен, я добавляю к нему аннотации, но похоже, что все делается асинхронно. Если я подожду, как секунду, прежде чем нажать кнопку «Назад», я не получу ошибки, но если я слишком быстро, он сработает. Я вообще не ошибаюсь, если я удалю строку addAnnotations. Я предполагаю, что это потому, что мой взгляд выпущен UINavigationController, прежде чем метод addAnnotations выполнил эту работу.

Любое хорошее решение для этого? Я не хочу, чтобы пользователь ждал (например, отображая загрузочный вид); Я думаю, что решение может быть лучшим управлением памятью, но я не вижу, как это сделать.

if(DEBUG_MODE) { NSLog(@"Creating array of placemarks : begin"); } 
self.placemarkCache = [[NSMutableArray alloc] init]; 
// Loading placemarks for a placemark dictionary 
NSArray *sortedKeys = [[self.placemarkDictionary allKeys] sortedArrayUsingSelector:@selector(compare:)]; 
for (id key in sortedKeys) { 
    MyPlacemark *currentPlacemark = [self.placemarkDictionary objectForKey:key]; 
    [self.placemarkCache addObject:currentPlacemark]; 
    [currentPlacemark release]; 
} 
if(DEBUG_MODE) { NSLog(@"Creating array of placemarks : done"); } 
if(DEBUG_MODE) { NSLog(@"Adding placemarks : begin"); } 
[self.mapView addAnnotations:self.placemarkCache]; 
if(DEBUG_MODE) { NSLog(@"Adding placemarks : done"); } 

На этом примере я получаю «Добавление меток: сделано» сообщение, прежде чем что-либо получить отображаются на карте.

ответ

5

Я столкнулся с тем же вопросом или ошибкой и нашел решение на blog post.

Вы видите, что то, что вы видите, такое же, как проблема в сообщении, если посмотреть на трассировку стека отладчика.

Проблема связана с тем, что MapViewController (родительский элемент MKMapView) был удален, а внутренняя структура MKMapView для асинхронной карты пытается вызвать делегат MKMapView (который был MapViewController).

Итак, на dealloc MapViewController вы должны сбросить MKMapView.delegate = nil, чтобы делегаты не вызывались после получения некоторых фрагментов.

ОБНОВЛЕНИЕ: это хорошая практика (это где-то в документах управления памятью) для делегатов nil в dealloc, прежде чем освободить владельца делегата. Это остановит проблемы, подобные этому, для длительных задач async.

+0

Это точно такая же проблема, и она работает :) Теперь это звучит очевидно ... Спасибо за ваш ответ! – Vivi

+1

Ваша ссылка больше не работает. – J2theC

Смежные вопросы