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

Rap*_*tor 3 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];
Run Code Online (Sandbox Code Playgroud)

这两种方法有什么区别?

loc*_*ani 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,过来这里,我需要你拿起这个东西字符串离开我的家门口,把它变成一个数据对象,字符串,等待,轻轻一点!不要破坏任何东西"

哪个更清楚?