Cocoa Webkit bug?

时间:2010-02-01 02:25:06

标签: cocoa webkit nsarray

我有一些代码从数组中获取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而不是数组,然后才有效。

1 个答案:

答案 0 :(得分:25)

  

然而,当我运行此操作时,我收到此错误:

-[NSURL length]: unrecognized selector sent to instance 0x164dc0

首先,这是一个exception,而不是error

当你收到这样的消息时,请阅读它的内容:

-[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。

修复是双重的:

  1. 通过将变量声明为NSURL *,而不是NSString *来恢复声明。
  2. 请勿尝试在此处创建NSURL,因为您已经拥有NSURL。