[[NSMutableData alloc] initWithLength:]和CFDataCreateMutable()之间的区别?

时间:2012-06-29 23:49:07

标签: objective-c cocoa core-foundation nsmutabledata cfdata

我正在查看一些创建可变数据对象的代码,并将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和免费桥接?

1 个答案:

答案 0 :(得分:3)

NSMutableData initWithLength:创建一个数据对象,其原始数据用零填充,但CFDataCreateMutable创建一个空CFMutableDataRef。尽管它是用容量创建的,但它的长度仍为零。因此,当您使用CFDataGetMutableBytePtr时,它会返回NULL指针。

要解决此问题,您可以使用CFDataSetLength将CFMutableDataRef填充到其容量中,这会使用零填充数据。