NSMutableArray insertObject: (id) atIndex: int, вставляющий пустой ptr - PullRequest
2 голосов
/ 27 января 2011

В моем приложении у меня есть смесь кода C ++ и Objective C ++, в одном месте мне нужно вставить указатель объекта класса c ++ в NSMutableArray, но я получаю исключение NSINvalidArgument, Может кто-нибудь направить меня, как я могу вставить пустой указатель на NSMuatableArray

Это то, что я пробовал,

pArray = [[NSMutableArray alloc]initWithCapacity:myList.size()];

Node *node = myList.getHead();

int idx =0;
void *ptr = nil;
while ( node ) {
    [pCTArray insertObject:(NSObject *)node atIndex:idx];
    node = node->getNext();
    idx++;

}

Есть ли другой способ вставить его в MutableArray, возможный обходной путь, который я сделал: наличие ссылки индекса магазина это

[myArray insertObject:[NSNumber numberWithInt:idx] atIndex:idx];

и этот массив, который я буду использовать во всех методах делегатов NSTable / NSOutliveVIew, мне нужно выбрать индекс и получить элемент из списка ссылок, но беспокоюсь из-за производительности, так как потребуется слишком много вызовов функции,

Это какая-то ошибка в Какао или я делаю что-то не так?

Ответы [ 3 ]

5 голосов
/ 27 января 2011

NSArrays ожидает, чтобы содержать объекты target-C, соответствующие протоколу NSObject. Если вы хотите обернуть указатель, используйте NSValue:

[myArray insertObject:[NSValue valueWithPointer:node] atIndex:idx];

Вы вручную отвечаете за все управление памятью этого указателя, так как target-C не может сосчитать ссылку обычным способом.

1 голос
/ 27 января 2011

NSMurableArray принимает только объекты Objective-C (следовательно, тип аргумента addObject: равен id).

Вы на Mac или iOS? Если вы на Mac, вы можете посмотреть на NSPointerArray.

Вы также можете быть CFMutableArray с пользовательскими функциями обратного вызова, но я сам не пробовал.

0 голосов
/ 27 января 2011

Третий вариант - NSPointerArray.

...