我有一些代码从数组中获取URL并将其存储为字符串,然后使用该字符串加载URL。
NSString *first = [urls objectAtIndex:[sender clickedRow]];
NSLog(@"%@", first);
[[webview mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:first]]];
然而,当我运行此操作时,我收到此错误:
-[NSURL length]: unrecognized selector sent to instance 0x164dc0
本案例中的链接为http://www.digg.com
我知道错误在行
NSString *first = [urls objectAtIndex:[sender clickedRow]];
因为我尝试将字符串的值直接设置为URL而不是数组,然后才有效。
答案 0 :(得分:25)
然而,当我运行此操作时,我收到此错误:
-[NSURL length]: unrecognized selector sent to instance 0x164dc0
当你收到这样的消息时,请阅读它的内容:
-[NSURL
您发送此邮件的对象是NSURL对象。
length]:
邮件的选择器为length
。
现在,为什么要向NSURL对象发送length
消息?你不会,而你自己也没有这样做。还有其他的事情。
但是您会向字符串对象发送length
消息。所以,你有一个NSURL对象,你把它传递到一个预期字符串的地方。
您展示的代码中只有一个段落:
[NSURL URLWithString:first]
该例外告诉您first
已经是NSURL;它不是一个字符串。您不需要从中创建NSURL,因为它已经是一个,并且尝试以任何方式将其视为字符串将导致异常。
您可能会因为上一行的理由而反对我的主张:
NSString *first = [urls objectAtIndex:[sender clickedRow]];
您的反对意见是声明清楚地表明first
是指向NSString的指针,所以我一定是错的。
但事实并非如此。 您将 first
声明为指向NSString的指针。也就是说,你告诉编译器变量first
将保存一个指向NSString的指针。
但是你把一个指向NSURL的指针放到变量中。
在许多情况下,编译器会警告你已经骗了它,但在这种情况下它没有,因为对象来自objectAtIndex:
,它返回id
;因此,编译器不知道您将哪种类型的对象放入变量中。编译器,假设您说出了真相,并且确实在这里放置了NSString,并没有警告这个初始化。
但你不是。正如您在运行时发现的那样,该对象是NSURL。
修复是双重的:
NSURL *
,而不是NSString *
来恢复声明。