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
但是,当我运行这个时,我收到此错误:
Run Code Online (Sandbox Code Playgroud)-[NSURL length]: unrecognized selector sent to instance 0x164dc0
当你收到这样的消息时,请阅读它的内容:
-[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,因为它已经是一个,并且尝试以任何方式将其视为字符串将导致异常.
您可能会因为上一行的理由而反对我的主张:
Run Code Online (Sandbox Code Playgroud)NSString *first = [urls objectAtIndex:[sender clickedRow]];
你的反对意见是声明明确说明first是指向NSString的指针,所以我一定是错的.
但事实并非如此.您声明 first为指向NSString的指针.也就是说,你告诉编译器该变量first将保存一个指向NSString的指针.
但是你将一个指向NSURL的指针放入变量中.
在许多情况下,编译器会警告你,你已经撒谎,但在这种情况下它不会因为对象通过objectAtIndex:而返回id; 因此,编译器不知道您将哪种类型的对象放入变量中.编译器,假设您说出了真相,并且确实在这里放置了NSString,并不会对此初始化发出警告.
但你不是.正如您在运行时发现的那样,该对象是NSURL.
修复是双重的:
NSURL *,而不是将变量声明为声明NSString *.