Хранение CLLocationCoordinates2D в NSMutableArray
После некоторого поиска я получил следующее решение:
ссылка.
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.
Ответы
Ответ 1
Там нет утечки, просто отходы памяти кучи.
Вы можете просто использовать
CLLocationCoordinate2D new_coordinate;
new_coordinate.latitude = latitude;
new_coordinate.longitude = longitude;
[points addObject:[NSData dataWithBytes:&new_coordinate length:sizeof(new_coordinate)]];
Ответ 2
Иными словами, используя встроенный тип NSValue
, который создан именно для этой цели:
CLLocationCoordinate2D new_coordinate = { latitude, longitude };
[points addObject:[NSValue valueWithBytes:&new_coordinate objCType:@encode(CLLocationCoordinate2D)]];
Чтобы получить значение, используйте следующий код:
CLLocationCoordinate2D old_coordinate;
[[points objectAtIndex:0] getValue:&old_coordinate];
Ответ 3
Начиная с iOS 6, есть NSValueMapKitGeometryExtensions для NSValue
:
NSMutableArray *points = [NSMutableArray array];
CLLocationCoordinate2D new_coordinate = CLLocationCoordinate2DMake(latitude, longitude);
[points addObject:[NSValue valueWithMKCoordinate:new_coordinate]];
И чтобы получить значение:
CLLocationCoordinate2D coordinate = [[points objectAtIndex:0] MKCoordinateValue];
NSValueMapKitGeometryExtensions
требует MapKit.framework
CLLocationCoordinate2DMake()
требует CoreLocation.framework,
таким образом, этот импорт требуется:
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>