我的控制台出现错误:



这是我认为错误来自的代码:

- (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;
}

"jokes"是一个充满笑话的数组,以防你需要知道

为什么会出现这个错误?

另外,您是否看到错误的一部分:



如何确定“0x52e2f0”是什么,以便下次更容易找到问题?

最佳答案



因为您将 isEqualToString: 发送到 Joke 对象,而您的 Joke 对象不响应 isEqualToString:

您可能不是故意将该消息发送给您的 Joke 对象;相反,您将 Joke 对象传递或返回给需要 NSString 对象的对象。

你说 jokes 是一个“充满笑话的数组”。然而,在你的代码中,你这样做:



除了异常(exception),我猜测“充满笑话的数组”是指“笑话对象的数组”。

将 Joke 对象放入 NSString * 变量不会将 Joke 对象变为 NSString。您所做的只是告诉编译器该变量包含一个 NSString,然后将一个笑话放入其中。我称之为“对编译器说谎”。

解决这个问题的第一步是消除谎言并恢复真相:

Joke *joke = [jokes objectAtIndex:indexPath.row];

如果您在执行此操作后立即编译,您会注意到编译器在几行之后开始向您发出警告:



当然是对的。笑话仍然不是 NSStrings。现在您对变量的类型很诚实,编译器可以为您捕获它。

当您向 Joke 对象询问其文本时(我假设它具有用于此的属性,并且该属性的值是 NSString)并将其提供给 jokeTextLabel.text setter 时,实际修复就出现了。



在 Xcode 的 Breakpoints 窗口中,在 objc_exception_throw 上设置一个断点。然后运行你的程序。当异常发生时,调试器将停止您的程序,并打开调试器窗口。然后,在调试器控制台中输入 po 0x52e2f0。 ( po 代表“打印对象”。)

这适用于 Mac 应用程序;我假设它也适用于 iPhone 应用程序。

关于iphone - "isEqualToString" cocoa 错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/930929/

10-09 02:22