Какао и какао Touch. Как создать объект NSData из простого указателя?

Я создал целую кучу данных в экземпляре NSOperation. У меня есть указатель:

data = malloc(humungous_amounts_of_god_knows_what);
uint8_t* data;

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

free(data);

Да?

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

Спасибо,
Дуг


person dugla    schedule 11.06.2010    source источник


Ответы (2)


Вам нужен один из -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 документация вам пригодится)

person Barry Wark    schedule 11.06.2010

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

Я на самом деле пошел с чем-то еще проще.

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

NSValue *value = [NSValue valueWithPointer:imageData];

Поместите его в словарь, чтобы он был возвращен в основной поток:

[result setObject:value forKey:cubicFaceName];

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

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

С уважением,
Дуг

person dugla    schedule 12.06.2010