NSData dataWithBytesNoCopy返回错误的类型?

问题描述:

我正在使用适用于iOS的Windows Azure SDK将二进制文件上载到Azure Blob存储。一切都在调试工作正常,当构建直接复制到手机上,但是当它运行在通过TestFlight发出了即席构建,我得到这个异常:NSData dataWithBytesNoCopy返回错误的类型?

NSInvalidArgumentException: -[__NSCFConstantString dataWithBase64DecodedString]: unrecognized selector sent to instance 

现在在Azure SDK定义dataWithBase64DecodedString在一个类别在NSData的,而在这个代码块中出现异常:

void* buffer=malloc(CC_SHA256_DIGEST_LENGTH); 
CCHmac(kCCHmacAlgSHA256, [cKey bytes], [cKey length], [contentData bytes], [contentData length], buffer); 
NSData *encodedData = [NSData dataWithBytesNoCopy:buffer length:CC_SHA256_DIGEST_LENGTH freeWhenDone:NO]; 
contentMD5 = [encodedData stringWithBase64EncodedData]; /* exception is on this line */ 
free(buffer); 

正如你所看到的,encodedData应该是一个NSData。有时候是这样。但是,一旦编译完成并在手机上远离我的调试器,就不是那么多。 Airbrake匹配从手机中拉出的故障记录。

任何想法?

+1

我猜想当它出于某种原因失败时使用的构建配置与azure SDK框架 – 2013-02-25 20:27:57

+0

没有正确链接,事实证明你是正确的......将-ObjC -load_all标志添加到链接器中修复了它。他们在调试但不是Release.if你添加这个作为答案,我会接受! – 2013-02-26 01:46:45

+0

不错,我已经添加了一个答案和一些更多的细节(如果我在某些方面不正确,评论)。另外我假设你的意思是'-all_load'而不是'-load_all'? – 2013-02-26 17:29:52

这可能是因为Azure框架未正确链接到构建设备而不是模拟器时使用的构建配置。由于这是类别方法的问题,因此在x86_64或ARM上进行链接时,问题可能是known bug。如果是这种情况,请尝试将-ObjC -all_load添加到其他链接器标志设置。