自 iOS 8.2 更新后,stringWithUTF8String 返回 nil
stringWithUTF8String returning nil since iOS 8.2 update
我一直在使用 stringWithUTF8String 将我的 NSData 转换为 NSString,如下所示:
if ([[NSString stringWithUTF8String:[responsedata bytes]] isEqualToString:@"SUCCESS"]){
dostuff...
}
一切正常;但是,自 8.2 iOS 更新以来,[[NSString stringWithUTF8String:[responsedata bytes]]
return 为零。
我使用以下代码解决了这个问题:
NSString *responseDataString = [[NSString alloc] initWithData:responsedata encoding:NSUTF8StringEncoding];
if ([responseDataString isEqualToString:@"SUCCESS"]){
dostuff...
}
在这两种情况下,responsedata
的打印说明是相同的:<OS_dispatch_data: data[0x7aeb6500] = { leaf, size = 7, buf = 0x7c390360 }>
我的问题是:为什么第一个选项 return 为零,为什么 iOS 8.2 更新后突然出现?
stringWithUTF8String 需要一个以 NUL 结尾的缓冲区,但您的 NSData 没有以 NUL 结尾。
在您的示例中,您的 NSData 包含 7 个字节,您期望的值也是 7 个字符。当您的 NSData 中的内存后面恰好有一个 NUL 时,这可能偶尔会起作用,但它通常不起作用。
转换非 NUL 终止的 NSData 的唯一安全方法是还告诉 NSString 缓冲区的长度,就像您在解决方案中所做的那样。
我一直在使用 stringWithUTF8String 将我的 NSData 转换为 NSString,如下所示:
if ([[NSString stringWithUTF8String:[responsedata bytes]] isEqualToString:@"SUCCESS"]){
dostuff...
}
一切正常;但是,自 8.2 iOS 更新以来,[[NSString stringWithUTF8String:[responsedata bytes]]
return 为零。
我使用以下代码解决了这个问题:
NSString *responseDataString = [[NSString alloc] initWithData:responsedata encoding:NSUTF8StringEncoding];
if ([responseDataString isEqualToString:@"SUCCESS"]){
dostuff...
}
在这两种情况下,responsedata
的打印说明是相同的:<OS_dispatch_data: data[0x7aeb6500] = { leaf, size = 7, buf = 0x7c390360 }>
我的问题是:为什么第一个选项 return 为零,为什么 iOS 8.2 更新后突然出现?
stringWithUTF8String 需要一个以 NUL 结尾的缓冲区,但您的 NSData 没有以 NUL 结尾。
在您的示例中,您的 NSData 包含 7 个字节,您期望的值也是 7 个字符。当您的 NSData 中的内存后面恰好有一个 NUL 时,这可能偶尔会起作用,但它通常不起作用。
转换非 NUL 终止的 NSData 的唯一安全方法是还告诉 NSString 缓冲区的长度,就像您在解决方案中所做的那样。