将文件路径从NSString转换为NSURL

时间:2010-01-27 21:45:21

标签: objective-c cocoa

我正在顺利地完成Cocoa,但这个问题看起来很基本,它取消了我学到的所有很酷的东西。 :/

我有一个生成的文件路径,它需要是NSURL格式。从研究来看,这是我写的代码:

NSLog(@"Old path = %@", pathToFile);
NSURL *xmlURL = [[[NSURL alloc] init] fileURLWithPath:pathToFile];
NSLog(@"New path = %@", [xmlURL absoluteString]);

输出:

2010-01-27 15:39:22.105 MusicLibraryStats[28574:a0f] Old path = file://localhost/Users/[username]/Music/iTunes/iTunes%20Music%20Library.xml
2010-01-27 15:39:22.105 MusicLibraryStats[28574:a0f] New path = (null)

首先,甚至不需要alloc-init; other people seem to get away with it。在这种情况下,如果我没有alloc-init,我会在该行上收到“无法识别的选择器”错误。当然,现在我只是变老了(null)。

我在哪里?

谢谢!

1 个答案:

答案 0 :(得分:34)

[[NSURL alloc] init]不仅不必要,而且无效fileURLWithPath:是一个类方法,这意味着您只能在类对象(即NSURL本身)上调用它。它不会产生编译错误,因为-(NSURL *)init返回类型为id的对象,并且不会导致运行时错误,因为-(NSURL *)init实际返回nil,并且消息发送到nil只会将另一个nil级联为返回值。

此代码应该有效:

NSString* pathToFile = @"/this/is/a/path";
NSURL* url = [NSURL fileURLWithPath:pathToFile];

<击>

我发现了你的问题。 -[NSOpenPanel URLs]返回一个NSURL对象数组,您将其视为NSString对象。那是不对的。您应该使用以下内容:

NSURL* url = [[oPanel URLs] objectAtIndex:0];

如果您查看pathToFile变量,调试器可能会告诉您。请务必下次检查。 :)用鼠标悬停一个变量可以得到它的类型。

但是,请记住,在某些情况下,您将合法地遇到与您预期的类型不同的其他类型。例如,私有NSPathStore2类是NSString集群的一部分,您可以执行NSString在NSPathStore2对象上支持的所有操作。 (如果发生这种情况并且您不太确定,请查看文档以查看您期望的类型是否为群集类型。这就是文档中调用它们的方式。)