iPhone mapView / mapKit с использованием removeAnnotation & addAnnotation приводит к утечке памяти? - PullRequest
1 голос
/ 05 февраля 2010

Для обновления местоположения индикатора GPS на картеПросмотр ...

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

... Я вижу, как чистая память медленно поднимается в Инструментах (симуляторе). Отсутствие сообщения «Leak», но «Net 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];

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

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

Ответы [ 3 ]

2 голосов
/ 10 марта 2011

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

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.увеличение памяти, которое вы видите, вероятно, из аннотации VIEWS.Они кэшируются на карте.Если вы все еще видите увеличение mem, возможно, ваше мнение снятие очереди неверно.

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

myGpsAnnotation.coordinate = region.center;
1 голос
/ 04 марта 2011

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

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

В вашем случае это вид карты:


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

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

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

0 голосов
/ 13 февраля 2010

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

...