2010-04-05 10 views
15

Después de algunas búsquedas, obtuve la siguiente solución: reference.Almacenando CLLocationCoordinates2D en 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); 

y acceder a ella como:

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

Sin embargo, alguien afirma que hay una pérdida de memoria en esta lista? ¿Alguien puede sugerirme dónde está la fuga y cómo solucionarla? Además, ¿hay una mejor manera de almacenar una lista de CLLocationCoordinate2D en NSMutableArray? Por favor, proporcione un código de muestra ya que soy un novato en Objective C.

Respuesta

6

No hay fugas, solo un desperdicio de la memoria del montón.

Se podía utilizar

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

Ésta es otra manera, mediante la orden interna de tipo NSValue que se hace precisamente para este propósito:

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

Para recuperar el valor utilice el código siguiente:

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

NSValue es una opción mejor como esto está dirigido específicamente para esto, también debería deshacerse de struct –

+0

He creado un objeto con dos propiedades dobles para mantener la latitud y longitud ... Porque tuve que agregar el cumplimiento de NSCoding. No tuvo éxito con esta sugerencia, porque mientras persiste lo está considerando como estructuras, y no puede codificar las estructuras. – LolaRun

+0

@LolaRun On SO Las preguntas de seguimiento están mal vistas. Deberías publicar esto como una pregunta separada. –

50

Comenzando con iOS 6, está el NSValueMapKitGeometryExtensions para NSValue:

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

Y para recuperar el valor:

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

El NSValueMapKitGeometryExtensions requieren MapKit.framework
CLLocationCoordinate2DMake() requiere CoreLocation.framework

+0

necesita mapkit framework para usar valueWithMKCoordinate – chings228

+0

esta debería ser la RESPUESTA ACEPTABLE – Jaro

Cuestiones relacionadas