繁体   English   中英

“isEqualToString”Cocoa错误

[英]“isEqualToString” Cocoa error

我在控制台中收到错误:

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

为什么会出现这个错误?

因为您正在向一个Joke对象发送isEqualToString:并且您的Joke对象不响应isEqualToString: .

您可能没有故意将该消息发送给您的Joke对象; 相反,您将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。 现在你对变量的类型很诚实,编译器可以为你捕获这个。

当你问其文本的笑话对象(我认为它会为这个属性,以及该属性的值是一个NSString), 给予到实际修复来jokeTextLabel.text制定者。

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

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

这适用于Mac应用程序; 我认为它也适用于iPhone应用程序。

通过“一个充满笑话的数组”,你显然意味着“一个充满类型的笑话类”的数组。 您不能将Joke对象分配给UILabel的text属性 - 它只需要NSString

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM