Хранение CLLocationCoordinates2D в NSMutableArray - PullRequest
15 голосов
/ 05 апреля 2010

После некоторых поисков я получил следующее решение: ссылка .

CLLocationCoordinate2D* new_coordinate = malloc(sizeof(CLLocationCoordinate2D));
new_coordinate->latitude = latitude;
new_coordinate->longitude = longitude;
[points addObject:[NSData dataWithBytes:(void *)new_coordinate
length:sizeof(CLLocationCoordinate2D)]];
free(new_coordinate);

И получить к нему доступ:

CLLocationCoordinate2D* c = (CLLocationCoordinate2D*) [[points objectAtIndex:0] bytes];

Однако кто-то утверждает, что здесь есть утечка памяти? Может кто-нибудь подсказать, где находится утечка и как ее исправить. Кроме того, есть ли лучший способ хранения списка CLLocationCoordinate2D в NSMutableArray? Пожалуйста, дайте пример кода, так как я новичок в Objective C.

Ответы [ 3 ]

70 голосов
/ 05 апреля 2010

Вот еще один способ, используя встроенный тип NSValue, который сделан именно для этой цели:

CLLocationCoordinate2D new_coordinate = { latitude, longitude };
[points addObject:[NSValue valueWithBytes:&new_coordinate objCType:@encode(CLLocationCoordinate2D)]];

Чтобы получить значение, используйте следующий код:

CLLocationCoordinate2D old_coordinate;
[[points objectAtIndex:0] getValue:&old_coordinate];
50 голосов
/ 05 февраля 2013

Начиная с iOS 6, есть NSValueMapKitGeometryExtensions для NSValue:

CLLocationCoordinate2D new_coordinate = CLLocationCoordinate2DMake(latitude, longitude);
[points addObject:[NSValue valueWithMKCoordinate:new_coordinate]];

И для получения значения:

CLLocationCoordinate2D coordinate = [[points objectAtIndex:0] MKCoordinateValue];

NSValueMapKitGeometryExtensions требует MapKit.framework
CLLocationCoordinate2DMake() требуется CoreLocation.framework

6 голосов
/ 05 апреля 2010

Нет утечки, просто трата кучи памяти.

Вы можете просто использовать

CLLocationCoordinate2D new_coordinate;
new_coordinate.latitude = latitude;
new_coordinate.longitude = longitude;
[points addObject:[NSData dataWithBytes:&new_coordinate length:sizeof(new_coordinate)]];
...