ios - 自 iOS 8.2 更新后 stringWithUTF8String 返回 nil

标签 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]]返回零。

我用下面的代码解决了这个问题:

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 更新后突然返回?

最佳答案

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

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

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

关于ios - 自 iOS 8.2 更新后 stringWithUTF8String 返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29005246/

相关文章:

ios - Objective-C/CocoaHTTPServer - 是否可以在没有任何 UI 的情况下将 CocoaHTTPServer 作为后台应用程序运行?

objective-c - 从 NSTableView 获取选定值

ios - 在 NSURLRequest 中检测到不正确的 NSStringEncoding 值 0x0000

objective-c - 将两个 double 值转换为字符串,然后使用新字符串创建一个字符串

ios - 使用 UIActivityViewController 在非官方 Twitter 客户端上共享内容?

iPhone - 在一张纸上打印多个图像

ios - 将 NSString[] 粘贴到 NSArray 中

ios - ld : Framework not found: DropboxSDK

objective-c - 在运行中以编程方式更改 iOS7 状态栏颜色?