iPhone MAPview / MapKit с использованием результатов removeAnnotation & addAnnotation в утечке памяти?

голоса
1

Чтобы обновить расположение индикатора GPS на MAPview ...

[mapView removeAnnotation:myGpsAnnotation];
[myGpsAnnotation release];
myGpsAnnotation = nil;
myGpsAnnotation = [[MapLocationAnnotation alloc] initWithCoordinate:region.center annotationType:MapAnnotationTypeGps title:MAP_ANNOTATION_TYPE_GPS];
[mapView addAnnotation:myGpsAnnotation];

... Я вижу, чистая память медленно поднимается в инструменты (тренажере). Нет всплеск «течи», но «Чистый Bytes» и «# Net» медленно увеличивающийся ... если этот код не закомментирован. Так что я 100% уверен, что это код обижая.

НО, если я делаю следующее ...

[mapView removeAnnotation:myGpsAnnotation];
[myGpsAnnotation release];
myGpsAnnotation = nil;
myGpsAnnotation = [[MapLocationAnnotation alloc] initWithCoordinate:region.center annotationType:MapAnnotationTypeGps title:MAP_ANNOTATION_TYPE_GPS];
[mapView addAnnotation:myGpsAnnotation];
[mapView removeAnnotation:myGpsAnnotation];
[mapView addAnnotation:myGpsAnnotation];
[mapView removeAnnotation:myGpsAnnotation];
[mapView addAnnotation:myGpsAnnotation];

... то «Чистый Bytes» и «# Net» расти намного быстрее. Возможно ли это не моя ошибка, и я пытаюсь отследить утечку в MapKit? Могу ли я на самом деле утечки памяти? Опять же, ничего не появляется в разделе «Утечки», но тогда я не понимаю, почему чистые значения будут непрерывно подниматься.

Спасибо за любую помощь, -Gord

Задан 04/02/2010 в 23:34
источник пользователем
На других языках...                            


3 ответов

голоса
2

Ваш цикл выпуска является неправильным:

myGpsAnnotation = [[MapLocationAnnotation alloc] initWithCoordinate:region.center annotationType:MapAnnotationTypeGps title:MAP_ANNOTATION_TYPE_GPS]; 
//retain count = 1

[mapView addAnnotation:myGpsAnnotation]; 
//retain count = 2 (the map does an extra retain)

[myGpsAnnotation release]; 
//retain count = 1
myGpsAnnotation = nil; //not really necessary

[mapView removeAnnotation:myGpsAnnotation]; 
//retain count = 0 -> dump (you can do this on the original place; I put it here to show the cycle)

PS. память увеличить вы видите, вероятно , из annotationVIEWS. Они кэшируются карте. Если вы все еще видите увеличение мем , вероятно , ваш вид освобождении пакета из очереди неправильно.

PPS. вы рассматривали только установив новое место для аннотирования. Гораздо проще, если место это единственное, что меняется.

myGpsAnnotation.coordinate = region.center;
Ответил 10/03/2011 в 11:55
источник пользователем

голоса
1

Вы должны сначала понять, как работает коллекция.

Добавление и объект коллекции сохранит его.
Удаление объекта из коллекции выпустит его.

В вашем случае это посмотреть на карте:


  1. После добавления аннотации к карте точки зрения, вы должны освободить его, если у вас есть ссылка.
  2. После удаления аннотации от вида карты не нужно ВЗ выпустить его.

 MyClass *obj=[[MClass alloc] init];
 [mapview addObject:obj];
 [obj release];
 ...
 [mapview removeAnnotation:obj];

Вот и все. Нет необходимости выпускать здесь.

Ответил 04/03/2011 в 08:38
источник пользователем

голоса
0

Если вы наблюдаете это во время тестирования на симуляторе, не волнуйтесь. Кажется, что комплект карты кэширует фрагменты карты памяти при работе на тренажере в то время как на устройстве, он использует SQLite для хранения фрагментов карты, а не ограниченная оперативной память на устройстве.

Ответил 13/02/2010 в 18:29
источник пользователем

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