2010-01-27 124 views
25

我正在通过Cocoa顺利,但这个问题似乎很基本,它取消了我学到的所有酷东西。 :/从NSString转换文件路径到NSURL

我有一个生成的文件路径,它需要在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,那么在该行上会出现'无法识别的选择器'错误。当然,现在我只是变老了(空)。

我是从哪里来的?

谢谢!

回答

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对象上支持的所有内容。 (如果发生这种情况,并且您不太确定,请查看文档以查看您期望的类型是否为集群类型,这就是它们在文档中的名称。)

+0

我明白了。谢谢。有什么方法可以(如果有的话)将我现在所使用的字符串转换成你所拥有的字符串? 断点确实有用,但在这种情况下我可以用它们做的事情并不多。我可以进入fileURLWithPath :,但是如果涉及运行时错误(就像我没有alloc-init时那样),我能做的最好的事情就是检查程序集。 – spamguy 2010-01-27 22:10:24

+11

所有你需要做到这一点:'NSURL * xmlURL = [NSURL fileURLWithPath:pathToFile];'如果你仍然有问题,这个问题可能是'pathToFile'。使用调试器查明。 – Alex 2010-01-27 22:28:13

+0

不,这个字符串绝对是普通的ol'file:// localhost/Users/[username] /Music/iTunes/iTunes%20Music%20Library.xml。它是使用NSOpenPanel生成的...pathToFile = [[oPanel URLs] objectAtIndex:0]; – spamguy 2010-01-27 23:06:01