如何创建NSMutableArray结构?

时间:2011-06-02 09:42:44

标签: objective-c

我创建了一个像这样的结构

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

我需要创建这个Node结构的NSMutableArray我需要知道如何创建节点路径的对象它NSMutableArray检索它并读取例如端口。

3 个答案:

答案 0 :(得分:39)

遇到这个问题之后,我遇到了这个有帮助的帖子,但比我最终解决的问题更复杂。

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

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

我希望这个答案会为下一个人节省一些时间。

答案 1 :(得分:13)

您实际上可以创建一个自定义类(因为它只包含NSString个指针),并将struct值作为实例变量。我认为它甚至更有意义。

您还可以创建一个包含这些结构的NSValue数组:

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

然后您可以按如下方式检索这些结构:

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

答案 2 :(得分: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];

要从Node检索NodeWrapper,您只需执行以下操作:

Node *n = nw->node;

Node n = *(nw->node);