[英]Error:Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFNumber isEqualToString:]:
[英]“isEqualToString” Cocoa error
我在控制台中收到错误:
2009-05-30 20:17:05.801 ChuckFacts [1029:20b] *** - [Joke isEqualToString:]:无法识别的选择器发送到实例0x52e2f0
这是我的代码,我相信错误来自:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Joke";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
[[NSBundle mainBundle] loadNibNamed:@"TableCell" owner:self options:nil];
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero
reuseIdentifier:CellIdentifier] autorelease];
cell = tableCell;
}
NSString *jokeText = [jokes objectAtIndex:indexPath.row];
UILabel *jokeTextLabel = (UILabel*) [cell viewWithTag:1];
jokeTextLabel.text = jokeText;
NSString *dateText = formattedDateString;
UILabel *dateTextLabel = (UILabel*) [cell viewWithTag:2];
dateTextLabel.text = dateText;
[self todaysDate];
return cell;
}
“笑话”是一个充满笑话的阵列,你需要知道
为什么会出现这个错误?
另外,您是否看到错误的部分内容:
发送到实例0x52e2f0
如何确定“0x52e2f0”是什么,以便下次更容易找到问题?
为什么会出现这个错误?
因为您正在向一个Joke对象发送isEqualToString:
并且您的Joke对象不响应isEqualToString:
.
您可能没有故意将该消息发送给您的Joke对象; 相反,您将Joke对象传递或返回到期望NSString对象的东西。
你说jokes
是一个“充满笑话的阵列”。 但是,在您的代码中,您执行此操作:
NSString *jokeText = [jokes objectAtIndex:indexPath.row]; UILabel *jokeTextLabel = (UILabel*) [cell viewWithTag:1]; jokeTextLabel.text = jokeText;
除了异常之外,我猜测通过“数组充满笑话”,你的意思是“一堆笑话对象”。
将Joke对象放入NSString *
变量不会将Joke对象转换为NSString。 您所做的只是告诉编译器该变量包含一个NSString,然后将一个Joke放入其中。 我称之为“对编译器撒谎”。
解决这个问题的第一步是取消谎言并在其位置恢复真相:
Joke *joke = [jokes objectAtIndex:indexPath.row];
如果在执行此操作后立即编译,您会注意到编译器已经开始在几行之后给出警告:
jokeTextLabel.text = jokeText;
警告:从不同的Objective-C类型传递'setText:'的参数1
当然,这是对的。 笑话仍然不是NSStrings。 现在你对变量的类型很诚实,编译器可以为你捕获这个。
当你问其文本的笑话对象(我认为它会为这个属性,以及该属性的值是一个NSString), 并给予到实际修复来jokeTextLabel.text
制定者。
如何确定“0x52e2f0”是什么,以便下次更容易找到问题?
在Xcode的Breakpoints窗口中,在objc_exception_throw
上设置断点。 然后运行你的程序。 发生异常时,调试器将停止程序,调试器窗口将打开。 然后,在调试器控制台中键入po 0x52e2f0
。 ( po
代表“打印对象”。)
这适用于Mac应用程序; 我认为它也适用于iPhone应用程序。
通过“一个充满笑话的数组”,你显然意味着“一个充满类型的笑话类”的数组。 您不能将Joke对象分配给UILabel的text
属性 - 它只需要NSString
。
(Cocoa不像Java或C ++,任何对象都可以通过一些.toString()
方法自动强制转换为字符串。通常,框架在需要字符串时会明确要求NSString
。)
这是正在发生的事情:您正在为text
属性分配一个Joke
对象。 Cocoa允许你快速和松散地使用这样的类型,在这种情况下甚至没有警告,因为它被隐含地理解为NSString( id
类型将默默地成为你分配给它的任何类型)。 但是当它试图在Joke对象上调用isEqualToString:
一个NSString方法)时,它当然会失败。
您需要将笑话的文本分配给标签。
至于如何识别对象:你可以在调试器中发出po 0x52e2f0
命令,如果内存没有被完全打开,这通常有效。 它将在该地址打印对象的Objective-C表示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.