Разница между [[NSMutableData alloc] initWithLength:] и CFDataCreateMutable()?

Я смотрю на некоторый код, который создает изменяемый объект данных и помещает в него хэш SHA1. Если я инициализирую целевой изменяемый объект данных с помощью

CFMutableDataRef hashDataRef = (CFMutableDataRef)[[NSMutableData alloc] initWithLength:SHA_DIGEST_LENGTH];

все работает нормально. Если я изменю эту строку на

CFMutableDataRef hashDataRef = CFDataCreateMutable(kCFAllocatorDefault, SHA_DIGEST_LENGTH);

он ломается (изменяемый объект данных кажется пустым после команды SHA1). В обоих случаях строка, следующая за созданием hashDataRef,

SHA1(CFDataGetBytePtr(inputDataRef), CFDataGetLength(inputDataRef), CFDataGetMutableBytePtr(hashDataRef));

Я не ожидал, что между ними будет какая-то разница, но явно что-то упускаю. Есть ли правильный способ Core Foundation для получения изменяемого объекта данных, который я хочу, без использования NSMutableData и бесплатного моста?


person Isaac    schedule 29.06.2012    source источник


Ответы (1)


NSMutableData initWithLength: создает объект данных, необработанные данные которого заполнены нулями, а CFDataCreateMutable создает пустой CFMutableDataRef. Несмотря на то, что он был создан с емкостью, его длина все равно равна нулю. Итак, когда вы используете CFDataGetMutableBytePtr, он возвращает указатель NULL.

Чтобы исправить это, вы можете заполнить CFMutableDataRef до его вместимости, используя CFDataSetLength, который заполняет данные нулями.

person wquist    schedule 30.06.2012
comment
Возможно, стоит отметить, что CFDataCreateMutable() больше похож на -[NSMutableData initWithCapacity:]. - person Justin Spahr-Summers; 30.06.2012
comment
На самом деле это сходство обманчиво. Вместимость CFDataCreateMutable() является строгим ограничением. Емкость -[NSMutableData initWithCapacity:] — это всего лишь нижняя граница первого распределения (когда это происходит), но она не препятствует тому, чтобы объект расширялся за ее пределы. В основном это просто оптимизация. - person Ken Thomases; 30.06.2012