Какао и Какао Touch.Как мне создать объект NSData из простого указателя ole? - PullRequest
0 голосов
/ 12 июня 2010

У меня malloc'd целый беспорядок данных в экземпляре NSOperation.У меня есть указатель:

data = malloc(humungous_amounts_of_god_knows_what);
uint8_t* data;

Как мне упаковать его как экземпляр NSData и вернуть в основной поток?Я предполагаю, что после преобразования в экземпляр NSData я могу просто позвонить:

free(data);

Да?

Кроме того, обратно в основной поток, как я могу получить указатель?

Спасибо,
Даг

Ответы [ 2 ]

1 голос
/ 12 июня 2010

Требуется один из -dataWithBytes:length: или его варианты:

NSData *d = [NSData dataWithBytes:data length:lengthOfDataInBytes];

, который копирует байты, и вы можете free(data). Чтобы сохранить копию, предполагая, что data выделено с использованием malloc, используйте:

NSData *d = [NSData dataWithBytesNoCopy:data length:lengthOfDataInBytes];

Вы должны не вызывать free в вашем буфере в этом случае, поскольку экземпляр NSData освободит его для вас.

Обратите внимание, что все эти методы возвращают экземпляр autoreleased, поэтому вам, вероятно, придется сохранить его, если вы хотите сохранить его между потоками (и не используете GC). Вместо этого вы можете использовать эквивалентные alloc / initWithBytes:... инициализаторы.

Чтобы получить указатель на содержимое NSData, используйте bytes.

(я думаю, что несколько минут с документацией NSData вам пригодятся)

0 голосов
/ 12 июня 2010

Спасибо, Барри,

На самом деле я пошел с чем-то еще более простым.

Поместите оболочку NSValue вокруг указателя:

NSValue *value = [NSValue valueWithPointer:imageData];

Запишите это в словарь, чтобывернулся к основному потоку:

[result setObject:value forKey:cubicFaceName];

Вернемся к основному потоку, когда я закончу с данными, которые я отбрасываю:

uint8_t *bits = [value pointerValue];
free(bits);

Приветствия,
Дуг

...