我何时应该使用NSURL而不是NSString,反之亦然?

时间:2011-10-14 14:34:28

标签: objective-c cocoa-touch cocoa nsstring nsurl

这不是关于相关问题的问题。这是一个我试图加深对Objective-C或更具体的Cocoa Foundation的理解的问题。

在处理从服务器上传和下载文件到我的应用程序时,我经常使用NSURLNSString来解决与路径相关的所有问题。当然,当有现有的API时,我只是根据规格使用它。但是当我存储自己的路径或创建处理它们的自定义类时,我很困惑这两个中哪一个会更好。

NSString随处可见,它有stringByAppendingPathComponent:stringByAppendingPathExtension:等便捷方法。我可以通过使用[NSURL URLWithString:@"string"]创建新实例,然后通过在NSURL实例上调用[url path]来轻松转换为NSURL。但差异是有原因的,对吗?

当我查看类似NSFileManager的头文件时,我的困惑就会增加。这两种方法非常接近:

- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;
- (BOOL)copyItemAtURL:(NSURL *)srcURL toURL:(NSURL *)dstURL error:(NSError **)error NS_AVAILABLE(10_6, 4_0);

为什么我会选择使用一个而不是另一个,特别是当两者之间的转换如此容易时?为什么Apple会为使用这两种数据类型而创建几乎相同的API呢?

如果有人对您自己的处理文件路径和远程网址的类使用NSURL而不是NSString有更深入的了解,请分享!欢呼声。

2 个答案:

答案 0 :(得分:8)

NSUrl知道如何处理几乎任何网址王 - 不仅仅是网址,而是将其拆分为易于访问的块:

  • 协议或方案(http,ftp,telnet,ssh)
  • 用户名和密码(例如ssh:ssh:// user:password@host.domain.org)
  • 主机名
  • port
  • 路径
  • 获取参数

现在你可以轻松地向url-object询问这个块,而在字符串中可能需要过多的if规则或复杂的正则表达式。

答案 1 :(得分:4)

通常,对于与路径相关的操作,您应该优先NSURL而不是NSString,因为路径信息可以更有效地存储在NSURL中(根据NSFileManager的类引用) 。因此,我建议您使用NSURL

此外NSURL还有URLByAppendingPathComponent:URLByAppendingPathExtension:,因此也很方便: - )