Как создать NSMutableArray структур?
Я создал такую структуру
typedef struct Node {
NSString* Description;
NSString* AE;
NSString* IP;
NSString* Port;
} Node;
Мне нужно создать NSMutableArray
этой структуры Node, мне нужно знать, как создать объект Node, передать его в NSMutableArray
извлечения и прочитать, например, порт.
Ответы
Ответ 1
Вы можете хранить объекты 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);
Ответ 2
После того, как я столкнулся с этой проблемой, я столкнулся с этим потоком, который помог, но был более сложным, чем решение, в котором я оказался.
В основном 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];
Я надеюсь, что этот ответ сохранит следующего человека немного времени.
Ответ 3
Фактически вы можете создать собственный класс (поскольку он содержит только указатели 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];