赞
踩
我有一些代码从数组中获取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
我知道这个bug就行了
NSString *first = [urls objectAtIndex:[sender clickedRow]];
因为我尝试将字符串的值直接设置为URL而不是数组,并且它有效.
但是,当我运行这个时,我收到此错误:
-[NSURL length]: unrecognized selector sent to instance 0x164dc0
首先,这是一个例外,而不是错误.
当你收到这样的消息时,请阅读它的内容:
-[NSURL
您发送此消息的对象是NSURL对象.
length]:
消息的选择器是length
.
现在,为什么要向length
NSURL对象发送消息?你不会,而你自己也没有这样做.其他的事情.
但是你会向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 *
.
不要尝试在这里创建NSURL,因为你已经有了NSURL.
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。