我正在顺利地完成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)。
我在哪里?
谢谢!
答案 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对象上支持的所有操作。 (如果发生这种情况并且您不太确定,请查看文档以查看您期望的类型是否为群集类型。这就是文档中调用它们的方式。)