自iOS 8.2更新以来,stringWithUTF8String返回nil。

5
我一直在使用stringWithUTF8String将NSData转换为NSString,操作如下:

if ([[NSString stringWithUTF8String:[responsedata bytes]] isEqualToString:@"SUCCESS"]){
    dostuff...
}

一直以来都运行得很好;然而,在8.2 iOS升级后,[[NSString stringWithUTF8String:[responsedata bytes]]返回了nil。

我通过使用以下代码解决了这个问题:

NSString *responseDataString = [[NSString alloc] initWithData:responsedata encoding:NSUTF8StringEncoding];

if ([responseDataString isEqualToString:@"SUCCESS"]){
    dostuff...
}

在两种情况下,responsedata 的打印描述都是相同的:<OS_dispatch_data:data [0x7aeb6500] = {leaf,size = 7,buf = 0x7c390360}> 我的问题是:为什么第一种选项会返回 nil,而且为什么突然在 iOS 8.2 更新后出现?

听起来像是一个 bug,我建议你向苹果提交一个 bug 报告。 - rckoenes
1个回答

4

stringWithUTF8String需要一个以NUL结尾的缓冲区,但是你的NSData没有以NUL结尾。

在你的例子中,你的NSData包含7个字节,而你期望的值也是7个字符。这可能偶尔会起作用,当你的NSData内存后面恰好有一个NUL时,但通常不会起作用。

将非NUL结尾的NSData转换为NSString的唯一安全方法是告诉NSString你的缓冲区的长度,就像你在解决方案中所做的那样。


谢谢解释!所以这不一定是iOS 8.2的问题,而是我之前只是“幸运”地让它工作了... - Stephan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接