Как преобразовать dispatch_data_t в NSData? - PullRequest
8 голосов
/ 06 февраля 2012

Это правильный путь?

// convert
const void *buffer = NULL;
size_t size = 0;
dispatch_data_t new_data_file = dispatch_data_create_map(data, &buffer, &size);
if(new_data_file){ /* to avoid warning really - since dispatch_data_create_map demands we care about the return arg */}

NSData *nsdata = [[NSData alloc] initWithBytes:buffer length:size];

// use the nsdata... code removed for general purpose

// clean up
[nsdata release];
free(buffer); // warning: passing const void * to parameter of type void *

Работает нормально. Моя главная проблема - утечки памяти. Утечка буферов данных не весело. Итак, все ли в порядке NSData, буфер и dispatch_data_t new_data_file?

Из того, что я могу прочитать на http://opensource.apple.com/source/libdispatch/libdispatch-187.7/dispatch/data.c, похоже, что буфер является DISPATCH_DATA_DESTRUCTOR_FREE. Значит ли это, что я обязан освободить буфер?

Ответы [ 2 ]

11 голосов
/ 30 октября 2013

Начиная с iOS 7 и Mac OS X 10.9 ( Замечания по выпуску Foundation ) dispatch_data_t является NSObject (NSObject <OS_dispatch_data>). dispatch_data_t теперь можно свободно приводить к NSData *, но не наоборот.

3 голосов
/ 06 февраля 2012

По большей части ваш код правильный. +initWithBytes:length: скопирует отправленный буфер, поэтому вам не нужно беспокоиться об освобождении буфера после данных, вы можете сначала безопасно освободить данные.

Согласно документации, вы НЕ освобождаете данные после того, как с ними покончено:

Если вы указываете ненулевые значения для buffer_ptr или size_ptr, значения возвращаются в эти переменные действительны только до тех пор, пока вы не освободите вновь созданные данные отправки объект. Вы можете использовать эти значения как быстрый способ доступа к данным нового объект данных.

Вы просто отпускаете переменную new_data_file (ARC не сделает этого за вас).

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