NSURL路径vs absoluteString

Gen*_*ike 59 nsurl

我已经看到了关于SO之间进行转换的许多问题NSURLNSString.他们都涉及使用NSString *path = [myURL absoluteString];NSString *path = [myURL path];. 这些方法之间的实际区别是什么? 是否有人应该使用另一个? 我尝试过咨询Apple Docs,但我觉得它不太有帮助.

我习惯于在网站和有关在不同机器之间发送信息的其他主题的讨论中提及URL,而在单个机器上处理文件结构时从未被提及过.也许这就是我的一些困惑所在,因为它NSURL似乎是访问文件的首选方式,无论该文件是存在于网络上还是存在于本地设备上.或者这可能是一个完全不相关的话题.我甚至都不确定.

HAS*_*HAS 135

问题1:

这些方法之间的实际区别是什么?

让我们分析这6行代码 - 3个用于本地代码,3个用于http URL - 并且稍微使用它们.

让我们创建一个NSURL使用该file://方案.如果你问自己,为什么有3 /后,file:你应该记住,一个完整的URL方案的存在(file://绝对或相对路径(你可以找到创造URL的更多信息,第3页RFC 1808),我们用它开始的绝对路径用/这样我们就结束了///.

NSURL *aLocalURL = [NSURL URLWithString:@"file:///Users/dennis/Desktop/"];
NSLog(@"absolute string: %@", aLocalURL.absoluteString);
NSLog(@"path: %@", aLocalURL.path);
Run Code Online (Sandbox Code Playgroud)

输出:

绝对字符串:file:/// Users/dennis/Desktop/
path:/ Users/dennis/Desktop

所以我们看到它absoluteString仍然知道它的方案,而path不再拥有这些信息.

注意: path是文件(目录)URL和文档状态,它被剥离的尾部斜杠.


现在让我们来看看远程URL.使用这些类型的URL,大多数人都更熟悉.我们使用与本地URL相同的过程创建它.我们的方案是现在http://和我们pathwww.apple.com/.

NSURL *anHTTPURL = [NSURL URLWithString:@"http://www.apple.com/"];  
NSLog(@"absolute string: %@", anHTTPURL.absoluteString);
NSLog(@"path: %@", anHTTPURL.path);
Run Code Online (Sandbox Code Playgroud)

输出:

绝对字符串:http://www.apple.com/
path:/

再次,我们看到绝对字符串仍然知道它的方案,但path现在/.因此path,在使用远程URL时,似乎不是一种合适的方法.

但是,当我们有一个URLhttp://www.apple.com/index.html我们得到的

绝对字符串:http://www.apple.com/index.html
path:/index.html

阅读文档也有帮助:

根据RFC 3986,权限(主机名和端口)部分之后的前导斜杠被视为路径的一部分.

所以path是后斜杠开始的一切(包括)的authoritywww.apple.com在我们的例子.


问题2

是否有人应该使用另一个?

文档:(方法:path)

如果此URL对象包含文件URL(由isFileURL确定),则此方法的返回值适合输入NSFileManager或NSPathUtilities的方法.

在我看来,这句话清楚地表明你应该path在你工作时使用NSFileManagerNSPathUtilities.


结论:

当您使用远程URL时(通常)使用absoluteString,否则结果不是您(通常)想要的结果.
当你一起工作的本地URL使用path.

来源:
http
://www.ietf.org/rfc/rfc1808.txt http://www.ietf.org/rfc/rfc3986.txt
NSURL类参考

  • @HAS似乎文档已经改变了.它现在说"URL对象是引用本地文件的首选方式.大多数从文件读取数据或向数据写入数据的AppKit对象都有接受NSURL对象而不是路径名作为文件引用的方法." 听起来像Apple现在更喜欢在路径上使用URL. (4认同)
  • 谢谢,这是对文档差异的彻底解释,而不是1句,自引用定义. (3认同)