2010-04-05 15 views
15

Dopo alcune ricerche, ho ottenuto la seguente soluzione: reference.Memorizzazione di CLLocationCoordinates2D in 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); 

e accedervi come:

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

Tuttavia, qualcuno sostiene che v'è una perdita di memoria qui? Qualcuno può suggerirmi dov'è la perdita e come risolverlo. Inoltre, esiste un modo migliore per archiviare un elenco di CLLocationCoordinate2D in NSMutableArray? Si prega di fornire un codice di esempio poiché sono un principiante dell'obiettivo C.

risposta

6

Non c'è nessuna perdita, solo uno spreco di memoria heap.

Si potrebbe utilizzare

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

Ecco un altro modo, utilizzando il tipo predefinito NSValue che è fatto proprio per questo scopo:

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

Per recuperare il valore utilizzare il seguente codice:

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

NSValue è una scelta migliore come questo è rivolto specificamente a questo, anche tu dovresti sbarazzarti della struct –

+0

Ho creato un oggetto con due proprietà doppie per il mantenimento della latitudine e della longitudine ... Perché ho dovuto aggiungere la conformità NSCoding. Non è riuscito a utilizzare questo suggerimento, perché mentre persistente lo considera come una struttura e non può codificare le strutture. – LolaRun

+0

@LolaRun On SO domande di follow-up sono disapprovate. Dovresti postare questo come una domanda separata. –

50

A partire da iOS 6, c'è il NSValueMapKitGeometryExtensions per NSValue:

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

E per recuperare il valore:

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

Il NSValueMapKitGeometryExtensions richiedono MapKit.framework
CLLocationCoordinate2DMake() richiede CoreLocation.framework

+0

necessario framework mapkit per utilizzare valueWithMKCoordinate – chings228

+0

questa dovrebbe essere la RISPOSTA ACCETTATA – Jaro