2012-02-27 76 views
4

将NSString转换为NSData有多种不同的方法。iOS:将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]; 

这两种方法有什么不同?

+1

有趣:一个是NSData的类方法,另一个是NSString的实例方法:) – doNotCheckMyBlog 2012-02-27 04:41:42

回答

6

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

为什么?

有些人会说效率。在这种情况下,使用字符串实例方法来创建一个NSData对象只需要一个单独的obj-c消息分派到Apple的代码中,该代码被高度优化。在另一种情况下(使用类方法创建一个新的NSData对象)将需要2个消息分派给你的字符串对象,1个消息分派给NSData类对象。

但是,运行时间不太可能会有很大的不同,即使他们这样做,编码的成本将取决于字符串的长度,而不是用于创建NSData对象的方法。

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

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

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

这似乎更清楚吗?

+0

有趣的解释。谢谢你的建议。 – Raptor 2012-02-27 06:15:47

4

你第一个电话是不正确。[req_string length]并不一定长度,以字节为单位,其-UTF8String的。你应该使用strlen得到真正的该-UTF8String的长度,而不是

这个例子表明,使用-[NSString dataUsingEncoding:]更好 - 有一个较少的参数来获取错误

还要注意:该文档为-[NSString dataUsingEncoding:]指出返回的数据是一个“外部表示”,意思是传送给其他机器,可能在前面包含BOM(字节顺序标记)。在实践中,BOM比UTF8更糟糕,所以-dataUsingEncoding:不包括它。如果你选择不同的编码,你可能会看到它。