Cocoa Webkit bug?

Mat*_* S. 4 cocoa webkit nsarray

我有一些代码从数组中获取URL并将其存储为字符串然后使用该字符串加载URL.

NSString *first = [urls objectAtIndex:[sender clickedRow]];
NSLog(@"%@", first);
[[webview mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:first]]];
Run Code Online (Sandbox Code Playgroud)

但是,当我运行这个时,我收到此错误:

-[NSURL length]: unrecognized selector sent to instance 0x164dc0
Run Code Online (Sandbox Code Playgroud)

本案例中的链接是http://www.digg.com

我知道这个bug就行了

NSString *first = [urls objectAtIndex:[sender clickedRow]];
Run Code Online (Sandbox Code Playgroud)

因为我尝试将字符串的值直接设置为URL而不是数组,并且它有效.

Pet*_*sey 25

但是,当我运行这个时,我收到此错误:

-[NSURL length]: unrecognized selector sent to instance 0x164dc0
Run Code Online (Sandbox Code Playgroud)

首先,这是一个例外,而不是错误.

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

-[NSURL
Run Code Online (Sandbox Code Playgroud)

您发送此消息的对象是NSURL对象.

length]:
Run Code Online (Sandbox Code Playgroud)

消息的选择器是length.

现在,为什么要向lengthNSURL对象发送消息?你不会,而你自己也没有这样做.其他的事情.

但是你会向length一个字符串对象发送一条消息.所以,你有一个NSURL对象,你把它传递到一个预期字符串的地方.

您展示的代码中只有一个段落:

[NSURL URLWithString:first]
Run Code Online (Sandbox Code Playgroud)

例外情况告诉你,这first已经是一个NSURL; 它不是一个字符串.您不需要从中创建NSURL,因为它已经是一个,并且尝试以任何方式将其视为字符串将导致异常.

您可能会因为上一行的理由而反对我的主张:

NSString *first = [urls objectAtIndex:[sender clickedRow]];
Run Code Online (Sandbox Code Playgroud)

你的反对意见是声明明确说明first是指向NSString的指针,所以我一定是错的.

但事实并非如此.您声明 first为指向NSString的指针.也就是说,你告诉编译器该变量first将保存一个指向NSString的指针.

但是你将一个指向NSURL的指针放入变量中.

在许多情况下,编译器会警告你,你已经撒谎,但在这种情况下它不会因为对象通过objectAtIndex:而返回id; 因此,编译器不知道您将哪种类型的对象放入变量中.编译器,假设您说出了真相,并且确实在这里放置了NSString,并不会对此初始化发出警告.

但你不是.正如您在运行时发现的那样,该对象是NSURL.

修复是双重的:

  1. 通过将变量声明为NSURL *,而不是将变量声明为声明NSString *.
  2. 不要尝试在这里创建NSURL,因为你已经有了NSURL.