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

epo*_*gee 9 cocoa cocoa-touch objective-c nsurl nsstring

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

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

NSString在任何地方都使用,它有像stringByAppendingPathComponent:和的方便的方法stringByAppendingPathExtension:.[NSURL URLWithString:@"string"]通过调用[url path]NSURL实例,我可以通过创建一个新实例和反过来轻松转换为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);
Run Code Online (Sandbox Code Playgroud)

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

如果有人对您自己的类处理文件路径和远程URL使用NSURL而不是NSString有更深入的了解,请分享!干杯.

Vik*_*ica 8

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

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

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


Alf*_*nso 4

通常,对于与路径相关的操作,您应该NSURL更喜欢它NSString,因为可以更有效地存储路径信息NSURL(根据 的类参考NSFileManager)。所以我建议您也使用 API NSURL

NSURLURLByAppendingPathComponent:URLByAppendingPathExtension:所以也很方便:-)

  • +1 此外,即将推出的 Mac App Store 沙箱规则需要权限,这些权限(据我所知)存储在 NSURL 本身中,从而更容易存档文件系统访问以供以后使用。 (2认同)