iOS:将NSString转换为NSData的不同方法

时间:2012-02-27 04:03:28

标签: objective-c nsstring nsdata

将NSString转换为NSData有不同的方法。

NSString *req_string = @"I am a NSString.";
NSData *req_data = [NSData dataWithBytes:[req_string UTF8String] length:[req_string length]];
// or
NSData *req_data_alt = [req_string dataUsingEncoding:NSUTF8StringEncoding];

这两种方法有何不同?

2 个答案:

答案 0 :(得分:6)

后者(NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding])是我推荐的选项。

为什么?

有些人会说效率。在这种情况下,使用字符串实例方法创建NSData对象只需要对Apple的代码进行单个obj-c消息调度,这是高度优化的。在另一种情况下(使用类方法创建一个新的NSData对象)将需要2个消息调度到您的字符串对象和1个消息调度到NSData类对象。

但是,运行时不太可能大不相同,即使它们确实如此,编码的成本也将取决于字符串的长度,而不是用于创建NSData对象的方法。

我认为你想在NSString上使用实例方法的真正原因是语义和清晰度。

让我们考虑这些选项的伪英语翻译:

  • [string DataUsingEncoding:NSUTF8StringEncoding]:嘿,字符串,我希望您使用UTF8编码给我一张NSData副本。好的,谢谢,把它放在那边 - 不,不是在地毯上。
  • [NSData dataWithBytes:[req_string UTF8String] length:[req_string length]]:字符串!给我你所有的UTF8字节。是的,哦,我也需要你的长度。秒。 NSData,过来这里,我需要你拿起这个东西字符串离开我的家门口,把它变成一个数据对象,字符串,等待,轻轻一点!不要破坏任何东西“

你觉得哪个更清楚?

答案 1 :(得分:4)

您的第一次通话不正确。 [req_string length]不一定是-UTF8String的长度(以字节为单位)。您应该使用strlen来获取-UTF8String的实际长度。

此示例显示使用-[NSString dataUsingEncoding:]更好 - 只有少一个参数可以出错。

另请注意:-[NSString dataUsingEncoding:]的文档声明返回的数据是“外部表示”,意味着要传输到其他计算机,可能包括前面的BOM(字节顺序标记)。实际上,对于UTF8,BOM比无用更差,因此-dataUsingEncoding:不包括它。如果你要选择不同的编码,你可能会看到它。