Какао-структуры и NSMutableArray - PullRequest
16 голосов
/ 01 июня 2010

У меня есть NSMutableArray, который я пытаюсь сохранить и получить доступ к некоторым структурам. Как мне это сделать? «addObject» выдает мне сообщение «Несовместимый тип для аргумента 1 addObject». Вот пример ('in' - это NSFileHandle, 'array' - это NSMutableArray):

//Write points
for(int i=0; i<5; i++) {
    struct Point p;
    buff = [in readDataOfLength:1];
    [buff getBytes:&(p.x) length:sizeof(p.x)];
    [array addObject:p];
}

//Read points
for(int i=0; i<5; i++) {
    struct Point p = [array objectAtIndex:i];
    NSLog(@"%i", p.x);
}

Ответы [ 3 ]

45 голосов
/ 01 июня 2010

Как уже упоминалось, NSValue может обернуть простую структуру, используя +value:withObjCType: или -initWithBytes:objCType::

// add:
[array addObject:[NSValue value:&p withObjCType:@encode(struct Point)]];

// extract:
struct Point p;
[[array objectAtIndex:i] getValue:&p];

См. Руководство по цифрам и значениям для дополнительных примеров.

3 голосов
/ 01 июня 2010

Вы получаете ошибки, потому что NSMutableArray может принимать только ссылки на объекты, поэтому вы должны заключить свои структуры в класс:

@interface PointClass {
     struct Point p;
}

@property (nonatomic, assign) struct Point p;

Таким образом, вы можете передать в случаях PointClass.

Редактировать : Как уже упоминалось выше и ниже, NSValue уже предоставляет это в более общем виде, так что вам следует пойти на это.

2 голосов
/ 01 июня 2010

Вы можете использовать NSValue, или в некоторых случаях может иметь смысл использовать словарь вместо структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...