Objective c 什么时候应该使用NSURL而不是NSString,反之亦然?

Objective c 什么时候应该使用NSURL而不是NSString,反之亦然?,objective-c,cocoa-touch,cocoa,nsstring,nsurl,Objective C,Cocoa Touch,Cocoa,Nsstring,Nsurl,这不是一个有关相关问题的问题。这是一个问题,我试图加深对Objto-C或更具体的可可基金会的理解。 在处理从服务器上传和下载文件到我的应用程序时,我总是在使用NSURL或NSString处理所有与路径相关的事情之间左右为难。当然,当有一个现有的API时,我只是根据规范使用它。但当我存储自己的路径或创建处理它们的自定义类时,我不知道这两个选项中哪一个更好 NSString在任何地方都可以使用,它有一些方便的方法,如stringByAppendingPathComponent:和stringByAp

这不是一个有关相关问题的问题。这是一个问题,我试图加深对Objto-C或更具体的可可基金会的理解。 在处理从服务器上传和下载文件到我的应用程序时,我总是在使用
NSURL
NSString
处理所有与路径相关的事情之间左右为难。当然,当有一个现有的API时,我只是根据规范使用它。但当我存储自己的路径或创建处理它们的自定义类时,我不知道这两个选项中哪一个更好

NSString
在任何地方都可以使用,它有一些方便的方法,如
stringByAppendingPathComponent:
stringByAppendingPathExtension:
。通过使用
[nsurlwithstring:@“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);
为什么我会选择使用一个而不是另一个,特别是当两者之间的转换如此容易时?为什么苹果要为使用这两种数据类型而创建几乎相同的API呢


如果有人对何时使用NSURL而不是NSString来处理文件路径和远程URL有更深入的了解,请分享!干杯。

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


此外,
NSURL
还具有
URLByAppendingPathComponent:
URLByAppendingPathExtension:
因此也提供了便利:-)

NSURL
知道如何处理几乎所有URL,而不仅仅是Web地址并将其拆分为易于访问的区块:

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

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

+1此外,即将推出的Mac App Store沙箱规则需要权限,而权限(据我所知)存储在NSURL本身中,使归档文件系统访问更容易,以备日后使用。我认为,在所有其他条件相同的情况下,使用NSURL API的一个主要理由是它们不是NSSTRING。很容易混淆相同类型的内容,而且NSURL的使用频率比NSSTRING少得多。考虑:
[fm copyItemAtPath:name…]
将编译,但无法工作,因为您可能需要
[fm copyItemAtPath:path…]
。感谢您的澄清,+1。我必须选择给谁打标记,@rapaudierend在那里有引用。当引用本地文件系统上的文件时呢?你是什么意思
NSURL
有一个。NSString也有一个。似乎NSURL通常是首选的,但我想知道它是否也适用于本地文件。就我自己而言,我只是求助于使用
NSURL
,除非我绝对需要使用
NSString
,比如在处理大量
NSFileManager
的API时。我想没有标准的答案。