stringWithUTF8String自iOS 8.2更新后返回nil

时间:2015-03-12 08:46:35

标签: ios objective-c nsstringencoding char-pointer ios8.2

我一直在使用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更新后会突然返回?

1 个答案:

答案 0 :(得分:4)

stringWithUTF8String需要一个NUL终止缓冲区,但你的NSData没有终止NUL。

在您的示例中,您的NSData包含7个字节,您期望的值也是7个字符。当NSData中的内存后面出现NUL时,这可能偶尔会起作用,但它通常不起作用。

转换非NUL终止NSData的唯一安全方法是告诉NSString缓冲区的长度,就像在解决方案中一样。