我的控制台出现错误:
这是我认为错误来自的代码:
- (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/