2010-04-05 12 views
15

Po pewnym przeszukaniu otrzymałem następujące rozwiązanie: reference.Przechowywanie CLLocationCoordinates2D w 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); 

i dostęp to tak:

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

jednak ktoś twierdzi, że jest wyciek pamięci tutaj? Czy ktoś może zasugerować mi, gdzie jest wyciek i jak to naprawić. Ponadto istnieje lepszy sposób przechowywania listy CLLocationCoordinate2D w NSMutableArray? Proszę podać przykładowy kod, ponieważ jestem początkującym celem C.

Odpowiedz

6

Nie ma wycieku, tylko strata pamięci sterty.

mógłby po prostu użyć

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

Oto kolejny sposób, korzystając z wbudowanego typu NSValue który jest wykonany dokładnie w tym celu:

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

Aby pobrać wartość użyć następującego kodu:

CLLocationCoordinate2D old_coordinate; 
[[points objectAtIndex:0] getValue:&old_coordinate]; 
+1

NSValue jest lepszym wyborem, jest to przeznaczone specjalnie do tego, również powinieneś pozbyć się struktury –

+0

Utworzono obiekt z dwoma podwójnymi właściwościami do utrzymywania szerokości i długości geograficznej ... Ponieważ musiałem dodać zgodność z NSCoding. Nie udało się skorzystać z tej sugestii, ponieważ podczas utrzymywania jest ona traktowana jako struktura i nie może kodować struktur. – LolaRun

+0

@LolaRun Na pytania uzupełniające są niezadowolony. Powinieneś opublikować to jako osobne pytanie. –

50

Począwszy od iOS 6, jest NSValueMapKitGeometryExtensions dla NSValue:

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

I aby pobrać wartość:

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

NSValueMapKitGeometryExtensions wymaga MapKit.framework
CLLocationCoordinate2DMake() wymaga CoreLocation.framework

+0

potrzebne ramy mapkit w celu użycia valueWithMKCoordinate – chings228

+0

to powinna być AKCEPTOWANA ODPOWIEDŹ – Jaro