2011-06-02 9 views
11

he creado una estructura como esta¿Cómo puedo crear un NSMutableArray de estructuras?

typedef struct Node { 
    NSString* Description; 
    NSString* AE; 
    NSString* IP; 
    NSString* Port; 
} Node; 

Necesito crear NSMutableArray de esta estructura de nodos que necesito saber cómo crear el objeto de ruta del nodo al NSMutableArray recuperar y leer, por ejemplo, el puerto.

+0

+ 1 a todos ustedes. –

Respuesta

3

Solo puede almacenar objetos Objective-C en un NSMutableArray.

Una de las rutas que puede tomar es utilizar una matriz estándar C:

unsigned int array_length = ...; 
Node** nodes = malloc(sizeof(Node *) * array_length); 

Otra ruta es envolver la estructura de un objeto de Objective-C:

@interface NodeWrapper : NSObject { 
    @public 

    Node *node; 
} 
- (id) initWithNode:(Node *) n; 
@end 

@implementation NodeWrapper 

- (id) initWithNode:(Node *) n { 
    self = [super init]; 
    if(self) { 
    node = n; 
    } 
    return self; 
} 

- (void) dealloc { 
    free(node); 
    [super dealloc]; 
} 

@end 

entonces, usted añadir NodeWrapper objetos a su NSMutableArray así:

Node *n = (Node *) malloc(sizeof(Node)); 
n->AE = @"blah"; 
NodeWrapper *nw = [[NodeWrapper alloc] initWithNode:n]; 
[myArray addObject:nw]; 
[nw release]; 

a rET Rieve la Node del NodeWrapper, sólo tiene que haría esto:

Node *n = nw->node; 

o

Node n = *(nw->node); 
+0

cómo recuperar datos de él o insertar en él podría darme más detalles – AMH

+0

Hola, utilicé la clase c objetiva, como dijiste, pero al intentar recuperar el objeto nada devuelve \t Nodo * object = (Node *) [NodesArray objectAtIndex : k]; \t \t NSLog (object.Description); – AMH

13

En realidad se puede crear una clase personalizada (ya que tiene sólo NSString punteros) con valores struct como variables de instancia . Creo que incluso tendría más sentido.

También puede crear una matriz de NSValue s que mantienen estas estructuras:

NSValue *structValue = [NSValue value:&myNode objCType:@encode(Node *)]; 
NSMutableArray *array = [[NSMutableArray alloc] initWithObject:structValue]; 

Luego, puede retreive estas estructuras de la siguiente manera:

NSValue *structValue = [array objectAtIndex:0]; 
Node *myNode = (Node *)[structValue pointerValue]; 
// or 
Node myNode = *(Node *)[structValue pointerValue]; 
+4

Wow. Aprendí algo hoy. ¡Increíble! :-) –

+0

¡Gracias! Me alegro de que haya encontrado esto útil también.) – Eimantas

39

Después de ejecutar en este problema, me encontré este hilo que ayudó, pero fue más complicado que la solución con la que terminé.

Básicamente, NSValue es el contenedor para su estructura, no necesita crear una nueva clase usted mismo.

// To add your struct value to a NSMutableArray  
NSValue *value = [NSValue valueWithBytes:&structValue objCType:@encode(MyStruct)]; 
[array addObject:value]; 

// To retrieve the stored value 
MyStruct structValue; 
NSValue *value = [array objectAtIndex:0]; 
[value getValue:&structValue]; 

Espero que esta respuesta le ahorrará a la próxima persona un poco de tiempo.

+0

+1 Gracias. Usé esta solución. – Griffin

+1

+1 Funciona bien y sin problemas para mí. –

+0

muchas gracias, esta es la primera vez que uso NSValue para encapsular struct. – Chauyan

Cuestiones relacionadas