将文件路径从NSString转换为NSURL

spa*_*guy 25 cocoa objective-c

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

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

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

并输出:

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)
Run Code Online (Sandbox Code Playgroud)

首先,alloc-init甚至不需要; 其他人似乎逃脱了它.在这种情况下,如果我没有alloc-init,我会在该行上收到"无法识别的选择器"错误.当然,现在我只是变老了(null).

我在哪里?

谢谢!

zne*_*eak 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];
Run Code Online (Sandbox Code Playgroud)

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

NSURL* url = [[oPanel URLs] objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

如果你查看pathToFile变量,调试器可以告诉你.请务必下次检查.:)用鼠标悬停变量应该得到它的类型.

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

  • 所有你需要这样做:`NSURL*xmlURL = [NSURL fileURLWithPath:pathToFile];`如果你仍然有问题,问题可能是`pathToFile`.使用调试器找出答案. (11认同)