iPhone MapKit выпускает несколько аннотаций.Это правильный путь? - PullRequest
1 голос
/ 26 марта 2011

Я пытаюсь разработать свое первое простое приложение для iphone, используя MapKit. Теперь я могу показать несколько аннотаций на карте с помощью этого простого кода. MyAnnotation - это класс, который генерирует аннотацию, а initWithInfo - это метод, который устанавливает координаты и заголовки.

//the first annotation
theCoordinate.latitude = 0.000;
theCoordinate.longitude = 0.000;
MyAnnotation *myAnnotation1 = [MyAnnotation alloc];
[myAnnotation1 initWithInfo:theCoordinate:@"Title":@"Subtitle"];
[self.mapAnnotations insertObject:myAnnotation1 atIndex:0];
[myAnnotation1 release];

//the second annotation
theCoordinate.latitude = 0.000;
theCoordinate.longitude = 0.000;
MyAnnotation *myAnnotation2 = [MyAnnotation alloc];
[myAnnotation2 initWithInfo:theCoordinate:@"Title":@"Subtitle"];
[self.mapAnnotations insertObject:myAnnotation2 atIndex:0];
[myAnnotation2 release];

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

Чтобы создать столько аннотаций, сколько я хочу, без ограничения создания объекта с уникальным именем, я попробовал следующий код, и он отлично работает.

CLLocationCoordinate2D theCoordinate;

//the first annotation
theCoordinate.latitude = 0.000;
theCoordinate.longitude = 0.000;
[self.mapAnnotations insertObject:[[MyAnnotation alloc] initWithInfo:theCoordinate:@"Title":@"Subtitle"] atIndex:0];

//the second annotation
theCoordinate.latitude = 0.000;
theCoordinate.longitude = 0.000;
[self.mapAnnotations insertObject:[[MyAnnotation alloc] initWithInfo:theCoordinate:@"Title":@"Subtitle"] atIndex:1];

Теперь простой вопрос: это правильный путь? Может ли этот код вызвать какие-либо проблемы?

Заранее спасибо от начинающего программиста target-c (хочу быть).

1 Ответ

1 голос
/ 29 марта 2011

Да, основная проблема заключается в том, что второй фрагмент кода добавил утечки памяти в ваше приложение. Другое - это то, что он не скомпилируется.

Когда вы добавляете объект в коллекцию, его счетчик увеличивается, что означает, что ваша строка

[self.mapAnnotations insertObject:[[MyAnnotation alloc] initWithInfo:theCoordinate:@"Title":@"Subtitle"] atIndex:0];

должно быть записано как

[self.mapAnnotations insertObject:[[[MyAnnotation alloc] initWithInfo:@"Title" theCoordinate:theCoordinate] autorelease] atIndex:0];

Обратите внимание на две вещи:

  1. Экземпляру MyAnnotation передается сообщение "autorelease" перед отправкой в ​​коллекцию аннотаций. Это один из способов устранения утечки памяти. Другой - использовать указатель, как в предыдущем фрагменте, а затем отправить сообщение о выпуске, как вы делали ранее.
  2. В Objective-C параметры не сходятся все вместе в конце вызова метода.

Надеюсь, это поможет!

...