Проблема addAnnotations (управление памятью, может быть?)

голоса
1

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

Все работает отлично за исключением одной вещи: если я перемещаться «слишком быстро» на моем UINavigationController, на iphone симулятор аварий, получая «BAD ACCESS EXC» сигнал. Например, если я загрузить мой взгляд, содержащий 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); }

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

Задан 07/09/2009 в 17:31
источник пользователем
На других языках...                            


1 ответов

голоса
5

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

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

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

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

UPDATE: это хорошая практика (это где-то в документации управления памятью) всухую делегат dealloc перед выпуском держателя делегата. Это остановит проблемы, как это происходило долго выполняющиеся задачи асинхронных.

Ответил 07/09/2009 в 17:35
источник пользователем

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