【问题标题】:How can I create an NSMutableArray of structs?如何创建结构的 NSMutableArray?
【发布时间】:2011-06-02 09:42:43
【问题描述】:

我创建了一个这样的结构

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

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

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    遇到这个问题后,我遇到了这个线程,它有帮助,但比我最终得到的解决方案更复杂。

    基本上 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];
    

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

    【讨论】:

    • 非常感谢,这是我第一次使用NSValue来封装struct。
    • 非常有用的答案!问题:打开 ARC 会如何影响?如果结构有 NSString* 字段,ARC 是否足够聪明以保持分配直到结构条目从 NSMutableArray 中删除?
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢!很高兴你发现这也很有用。)
    【解决方案3】:

    您只能将 Objective-C 对象存储在 NSMutableArray 中。

    您可以采取的一种方法是使用标准 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];
    

    要从NodeWrapper 中检索Node,您只需这样做:

    Node *n = nw->node;
    

    Node n = *(nw->node);
    

    【讨论】:

    • 如何从中检索数据或插入其中,您可以给我更多详细信息
    • 嗨,正如你所说,我使用了目标 c 类,但是在尝试检索对象时没有返回 Node* object=(Node*) [NodesArray objectAtIndex:k]; NSLog(object.Description);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多