查看CFDataRef的文档,我看不到任何会在创建CFDataRef后压缩它的内容。例如,在我的代码中,我做了类似这样的事情:
CFIndex byteSize = GetExportByteSize();
const UInt8 *exportData = GetExportDataPtr();
CFDataRef dataRef = CFDataCreate(kCFAllocatorDefault, exportData, byteSize);
CFDictionarySetValue(dict, kAS_ExportDataKey, dataRef);
基本上,我正在从一块大小约为2MB的内存中创建一个CFDataRef。听起来不是很多,但在实际应用中,这个数据太多了。
创建后是否可以压缩CFDataRef对象?或者压缩它指向的原始数据可能会更好吗?
答案 0 :(得分:1)
是否可以在创建后压缩CFDataRef对象?
zlib.h
是一种选择。
或者压缩它指向的原始数据可能会更好吗?
你想花多少时间来开发这个?使用您对输入数据的了解,可以减少数据结构的大小? zlib(或其他lib)中的实现是不可接受的吗?
答案 1 :(得分:1)
我应该注意OS X现在有SecTransform https://developer.apple.com/library/mac/#documentation/System/Reference/SecTransform_header_reference/Reference/reference.html,您可以使用它来对CFData进行ZLib压缩。我有一个在https://github.com/Machx/Zangetsu/blob/master/Source/CWZLib.m
使用它的例子-(NSData *)cw_zLibCompress {
SecTransformRef encoder;
CFDataRef data = NULL;
CFErrorRef error = NULL;
CFDataRef inputData = CFDataCreate(kCFAllocatorDefault, [self bytes], [self length]);
if (inputData == NULL) { return nil; }
encoder = SecEncodeTransformCreate(kSecZLibEncoding, &error);
if(error) { CWZLIBCLEANUP(); return nil; }
SecTransformSetAttribute(encoder, kSecTransformInputAttributeName, inputData, &error);
if (error) { CWZLIBCLEANUP(); return nil; }
data = SecTransformExecute(encoder, &error);
if (error) { CWZLIBCLEANUP(); return nil; }
NSData *compressedData = [[NSData alloc] initWithData:(__bridge NSData *)data];
CFRelease(encoder);
CFRelease(inputData);
return compressedData;
}