我的控制台出错:
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”是什么,以便下次更容易找到问题?
答案 0 :(得分:19)
为什么会出现这个错误?
因为您要将isEqualToString:
发送给Joke对象,并且您的笑话对象不响应isEqualToString:
。
你可能没有故意将这条消息发送给你的笑话对象;相反,您将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。既然你对变量的类型很诚实,编译器就可以为你捕捉到它。
当您向Joke对象询问其文本时(我假设它具有此属性,并且该属性的值是NSString)并将 提供给jokeTextLabel.text
setter。
如何确定“0x52e2f0”是什么,以便下次更容易找到问题?
在Xcode的Breakpoints窗口中,在objc_exception_throw
上设置断点。然后运行你的程序。发生异常时,调试器将停止程序,调试器窗口将打开。然后,在调试器控制台中键入po 0x52e2f0
。 (po
代表“打印对象”。)
适用于Mac应用;我认为它也适用于iPhone应用程序。
答案 1 :(得分:2)
通过“一个充满笑话的数组”,你显然是指“一个充满Joke类型的数组”。你不能将一个Joke对象分配给UILabel的text
属性 - 只需要NSString
。
(Cocoa不像Java或C ++,任何对象都可以通过某种.toString()
方法自动强制转换为字符串。通常,框架在需要字符串时会明确要求NSString
。 )
以下是正在发生的事情:您正在为Joke
属性分配text
个对象。 Cocoa允许你快速和松散地使用这样的类型,在这种情况下甚至没有警告,因为它被隐含地理解为NSString(id
类型将默默地成为你分配给它的任何类型)。但是当它试图在Joke对象上调用isEqualToString:
(一个NSString方法)时,它当然会失败。
您需要将笑话的文本分配给标签。
至于如何识别对象:您可以在调试器中发出po 0x52e2f0
命令,这通常在内存未被完全阻塞时起作用。它将在该地址打印对象的Objective-C表示。