Как я могу создать NSMutableArray структур? - PullRequest
11 голосов
/ 02 июня 2011

Я создал такую ​​структуру

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

Мне нужно создать NSMutableArray этой структуры Node. Мне нужно знать, как создать объект пути к узлу NSMutableArray, получить его и прочитать, например, порт.

Ответы [ 3 ]

39 голосов
/ 07 марта 2012

После столкновения с этой проблемой я наткнулся на этот поток, который помог, но был более сложным, чем решение, которым я закончил.

По сути, 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];

Надеюсь, этот ответ сэкономит следующему человеку немного времени.

13 голосов
/ 02 июня 2011

Вы можете создать собственный класс (так как он содержит только NSString указатели) со значениями структуры в качестве переменных экземпляра.Я думаю, что это даже имеет больше смысла.

Вы также можете создать массив из NSValue s, содержащий эти структуры:

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 голосов
/ 02 июня 2011

Вы можете хранить объекты 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];

Чтобы получить Node из NodeWrapper, вы просто сделаете это:

Node *n = nw->node;

или

Node n = *(nw->node);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...