【问题标题】:"isEqualToString" Cocoa error“isEqualToString”可可错误
【发布时间】:2014-10-07 17:06:28
【问题描述】:

我的控制台出现错误:

2009-05-30 20:17:05.801 ChuckFacts[1029:20b] *** -[笑话 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”是什么,以便下次更容易找到问题?

【问题讨论】:

标签: iphone objective-c cocoa exception


【解决方案1】:

为什么会出现这个错误?

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

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

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

NSString *jokeText = [jokes objectAtIndex:indexPath.row];
UILabel *jokeTextLabel = (UILabel*) [cell viewWithTag:1];
jokeTextLabel.text = jokeText;

除了例外,我猜你所说的“充满笑话的数组”是指“笑话对象的数组”。

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

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

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

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

jokeTextLabel.text = jokeText; 

警告:从不同的 Objective-C 类型传递“setText:”的参数 1

这是对的,当然。笑话仍然不是 NSStrings。既然您对变量的类型是诚实的,编译器可以为您捕捉到这一点。

当您向 Joke 对象询问其文本时(我假设它有一个属性,并且该属性的值是一个 NSString)并将 thatjokeTextLabel.text二传手。

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

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

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

【讨论】:

    【解决方案2】:

    “一个充满笑话的数组”显然是指“一个充满笑话类型的数组”。您不能将 Joke 对象分配给 UILabel 的 text 属性——它只需要 NSString

    (Cocoa 不像 Java 或 C++,其中任何对象都可以通过一些 .toString() 方法自动强制转换为字符串。通常,框架在需要字符串时会明确要求 NSStrings。)

    这就是发生的事情:您将 Joke 对象分配给 text 属性。 Cocoa 允许您快速轻松地使用此类类型,在这种情况下甚至没有警告,因为它被隐式理解为 NSString(id 类型将默默地成为您分配给它的任何类型)。但是当它尝试在 Joke 对象上调用 isEqualToString:(一个 NSString 方法)时,它当然会失败。

    您需要将笑话的文本分配给标签。

    至于如何识别对象:您可以在调试器中发出po 0x52e2f0 命令,如果内存没有完全耗尽,该命令通常可以工作。它将在该地址打印对象的 Objective-C 表示。

    【讨论】:

    • 实际上,在这种情况下没有(相关的)类型转换:NSArray 消息 objectAtIndex: 返回 'id',它可以强制转换为任何指针类型而不会发出警告。
    • 您实际上可以使用 -description 方法获取任何对象的字符串表示形式。默认实现只会返回类似 的东西,除非你覆盖它。
    • 对。但与 Java 不同的是,除了 NSLog 之外,没有自动强制或自动调用描述。
    猜你喜欢
    • 2012-03-24
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2015-08-10
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多