+[NSURL fileURLWithPath:]
,因为它很方便,但在性能分析中发现这是瓶颈的源头,因为它会在调用+[NSURL fileURLWithPath:isDirectory:]
(或Core Foundation等效函数)之前查询文件系统:这个方法假设如果路径以斜杠结尾,则
path
是目录。 如果path
不以斜杠结尾,则该方法会检查文件系统以确定path
是文件还是目录。 如果path
存在于文件系统中并且是目录,则该方法会追加一个尾随斜杠。如果path
不存在于文件系统中,则该方法假设它表示一个文件,并且不追加尾随斜杠。如果可能的话,我想避免这种开销。 但我并不总是提前知道我正在构建的URL是否为目录。例如,我可能只会得到一个路径或者我可能会得到一个目录和其中一个未知类型的项目的名称。我的问题是,是否可以始终传递
NO
给isDirectory
,即使这可能不准确?特别是,我想确保这不会影响
-[NSURL getResourceValue:forKey:error:]
和NSFileManager
。一些基本测试没有显示出这种优化的任何不良后果,但这并不意味着没有。我不完全清楚为什么
NSURL
在第一次关注isDirectory
。查看CFURL源代码,该代码似乎尝试确保目录路径始终以斜杠结尾。但是,除了用于显示目的之外,对我来说不清楚为什么这对文件系统路径很重要。(使用NSString
表示路径时从未出现过此问题。)+[NSURL fileURLWithPath:isDirectory:]
的文档指出isDir
是:一个布尔值,指定在与相对路径组件解析时
path
是否被视为目录路径。如果路径指示一个目录,则传递YES
,否则传递NO
。
实际上,如果我使用-[NSURL initWithString:relativeToURL:]
,除非使用isDirectory
的YES
值创建了baseURL
,否则新URL不会包含baseURL
的最后一个组件。但是,我不认为我曾经调用过这种方法,并且似乎系统也不需要代表我这样做(对于上述用例)。我注意到-[NSURL URLByAppendingPathComponent:]
会在必要时插入斜杠,而不是假设IS_DIRECTORY
标志是正确的。那么,除了创建相对URL外,这个标志有什么作用吗?即使我想这样做,在一般情况下始终传递正确的值似乎也不可能。文件系统可能总是在我身下更改。如果我使用+[NSURL fileURLWithPath:]
,因为路径在文件系统中可能还不存在,所以系统也不能始终确定它。