“isEqualToString”Cocoa错误

时间:2009-05-31 00:21:42

标签: iphone objective-c cocoa exception

我的控制台出错:

  

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”是什么,以便下次更容易找到问题?

2 个答案:

答案 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表示。