2008-12-25 9 views

Respuesta

44

Si desea utilizar una NSArray que necesita a la caja de seguridad de sus estructuras. Puede usar la clase NSValue para codificarlos.

Algo como esto para codificar:

struct foo { 
    int bar; 
}; 

struct foo foobar; 
foobar.bar = 3; 
NSValue *boxedFoobar = [NSValue valueWithBytes:&foobar objCType:@encode(struct foo)]; 

Y después de recuperarlo a cabo:

struct foo newFoobar; 

if (strcmp([boxedFoobar objCType], @encode(struct foo)) == 0) 
    [boxedFoobar getValue:&newFoobar]; 
+1

Una buena sugerencia, aunque hay un rendimiento de boxeo y desempaquetado. No es terrible, pero notable si necesitas la velocidad. –

11

Si estás de acuerdo con una disposición regular de edad C:

struct foo{ 
    int bar; 
}; 

int main (int argc, const char * argv[]) { 
    struct foo foobar[3]; 
    foobar[0].bar = 7; 
} 

Si desea una NSArray, se necesita un objeto envoltorio. La mayoría de las primitivas usan NSNumber, pero eso podría no ser aplicable a su estructura. Una envoltura no sería muy difícil de escribir, ¡aunque ese tipo de derrotas tiene el propósito de usar una estructura!

Editar: Esto es algo que no he hecho, pero solo he pensado. Si lo piensas, un NSDictionary es básicamente una estructura para objetos. Sus claves pueden ser los nombres de los componentes struct como NSStrings y sus valores pueden ser del tipo de datos correspondiente incluido en el contenedor Cocoa aplicable. Luego solo coloque estos diccionarios en un NSArray.

Creo que la esencia es que tienes muchas opciones. Si fuera usted, haría algo de experimentación y vería qué funciona mejor.

20

O asignar dinámicamente:

struct foo { 
    int bar; 
}; 

int main (int argc, const char * argv[]) { 
    struct foo *foobar = malloc(sizeof(struct foo) * 3); 
    foobar[0].bar = 7; // or foobar->bar = 7; 

    free(foobar); 
} 
2

¿Tiene que ser una estructura? En general, es mejor convertirlo en un objeto si puedes. Luego puede usar cosas como KVC y enlaces con ella.

+0

Hola Peter, ahora mismo no creo que los necesite, pero aún así es un tema que me interesa. Acabo de abrir una pregunta específica: http://stackoverflow.com/questions/393662 –

0

Es más fácil usar la clase, pero ¿qué sucede si necesita trabajar con C y estructuras objetivas como CGRect u otras? He tratado de utilizar NSValue, pero extraña obra ...:

CGRect rect =CGRectMake(20,220,280,30); 
NSValue* rectValue = [NSValue valueWithCGRect:rect]; 
NSArray *params1; 
params1= [NSArray arrayWithObjects:rectValue,nil]; 

Pero, puedo obtener el valor CGRect sólo como:

CGRect cgr = [[params1 objectAtIndex:0] CGRectValue]; 

Cuando utilizo este:

id currentVal = [params1 objectAtIndex:0]; 
void* buffer; 
buffer=[currentVal pointerValue]; 

que causa el error ...


problema resuelto here

Cuestiones relacionadas