2011-06-02 74 views
11

我创造了这样的如何创建结构体的NSMutableArray?

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

我需要创建这个节点结构,我需要知道如何创建节点路径的目标是到NSMutableArray检索和阅读,例如港口NSMutableArray的结构。

+0

+ 1给大家。 – 2012-11-09 08:02:33

回答

3

只能在NSMutableArray中存储Objective-C对象。可以采取

一种途径是使用一个标准的C数组:

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

另一条路线是包装结构在一个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 

然后,你会添加NodeWrapper对象的NSMutableArray这样的:

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

至RET rieve从NodeWrapperNode,你只需做到这一点:

Node *n = nw->node; 

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

如何从中检索数据或插入它可以给我更多的细节 – AMH 2011-06-02 09:47:42

+0

嗨,我用目标c类,因为你说,但尽量检索对象没有返回\t节点* object =(Node *)[NodesArray objectAtIndex :K]; \t \t NSLog(object.Description); – AMH 2011-06-02 10:09:39

13

实际上,你可以创建一个自定义类(因为它仅持有NSString指针)与结构值作为实例变量。我认为它更有意义。

您还可以创建的NSValue秒的阵列持有这些结构:

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

然后,您可以retreive这些结构如下:

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

哇。我今天学到了东西。真棒! :-) – 2011-06-02 09:52:42

+0

谢谢!很高兴你发现这个也很有用。) – Eimantas 2011-06-02 10:03:54

39

运行到这个问题后,我碰到这个线程的帮助,但比我最终解决方案更复杂。

基本上NSValue是你的结构的包装,你不需要自己创建一个新的类。

// 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]; 

我希望这个答案能够为下一个人节省一点时间。

+0

+1谢谢。我用这个解决方案。 – Griffin 2012-07-06 23:09:29

+1

+1它对我来说工作正常,顺利。 – 2012-11-09 08:26:26

+0

非常感谢,这是我第一次使用NSValue来封装结构体。 – Chauyan 2017-11-21 16:07:07