NSURLpathvs绝对string
我看到很多关于NSURL和NSString之间转换的问题。 它们都涉及使用NSString *path = [myURL absoluteString]; 或者NSString *path = [myURL path]; 。 这些方法之间的实际区别是什么? 有没有什么时候应该使用另一个? 我试过咨询一下苹果的文档 ,但是我发现它不是很有帮助。
我已经习惯了在讨论关于网站和有关在不同机器之间发送信息的其他主题的讨论中提到的URL,在处理单个机器上的文件结构时从未被提及过。 也许这是我的一些困惑来自哪里,因为NSURL似乎是访问文件的首选方式,不pipe该文件是存在于networking上还是在本地设备上。 或者,也许这是一个完全不相关的话题。 我甚至不确定。
问题1:
这些方法之间的实际区别是什么?
我们来分析一下这6行代码–3代表一个本地代码,3代表http URL – 然后再一点点的跟他们玩。
我们使用file:// scheme创build一个NSURL 。 如果你问自己为什么有3个/后面的file:你应该记住scheme( file://和绝对或相对path(你可以在第3页的RFC 1808中find关于创buildURL的更多信息)的完整URL)。我们使用以/开头的绝对path,以///结束。
NSURL *aLocalURL = [NSURL URLWithString:@"file:///Users/dennis/Desktop/"]; NSLog(@"absolute string: %@", aLocalURL.absoluteString); NSLog(@"path: %@", aLocalURL.path);
输出:
绝对string:file:/// Users / dennis / Desktop /
path:/用户/ dennis /桌面
所以我们看到absoluteString仍然知道它的scheme,而path不再有这个信息。
注意: path是一个文件(目录)的URL和文档状态,尾部的斜线被剥离。
现在我们来看看远程URL。 有了这些types的url,大多数人都比较熟悉。 我们使用与本地URL相同的过程来创build它。 我们的计划现在是http:// ,我们的path是www.apple.com/ 。
NSURL *anHTTPURL = [NSURL URLWithString:@"http://www.apple.com/"]; NSLog(@"absolute string: %@", anHTTPURL.absoluteString); NSLog(@"path: %@", anHTTPURL.path);
输出:
绝对string: http : //www.apple.com/
path:/
我们再次看到,绝对string仍然知道它的scheme,但path现在是/ 。 所以在使用远程URL时, path似乎不是一个合适的方式。
但是,当我们有一个像http://www.apple.com/index.html我们得到的URL
绝对string: http : //www.apple.com/index.html
path:/index.html
阅读文档也有帮助:
根据RFC 3986,权限(主机名和端口)部分之后的前导斜杠被视为path的一部分。
因此, path是在我们的案例www.apple.com的authority之后的一切开始(包括)的一切。
问题2
有没有什么时候应该使用另一个?
从文档 :(方法: path )
如果这个URL对象包含一个文件URL(由isFileURL决定),则这个方法的返回值适合inputNSFileManager或NSPathUtilities的方法。
在我看来,这句话明确指出,当你使用NSFileManager或NSPathUtilities时,你应该使用path 。
结论:
当您使用远程URL时,您(通常)使用absoluteString ,否则结果不是您(通常)所需的。
当您使用本地URL使用path 。
资料来源:
http://www.ietf.org/rfc/rfc1808.txt
http://www.ietf.org/rfc/rfc3986.txt
NSURL类参考