如何调试“无法识别的选择器发送到实例”问题?

时间:2009-03-08 01:29:36

标签: iphone

我在视图控制器中有以下代码(在所有其他方面)似乎工作正常:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    ProblemViewController *problemViewController = [[ProblemViewController alloc] initWithNibName:@"ProblemViewController" bundle:nil];
    problemViewController.problem = (Problem*)[self.problems objectAtIndex:indexPath.row];
    [self.navigationController pushViewController:problemViewController];
    [problemViewController release];
}

但是,当我运行此函数时,我收到以下错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[ProblemViewController initWithNibName:bundle:]: unrecognized selector sent to instance 0x57ca80'

我对可能导致它的原因感到茫然,所以我的问题是:我应该如何最好地调试这个问题?有什么明显的我应该检查吗?

5 个答案:

答案 0 :(得分:6)

检查ProblemViewController的基类。我打赌你不是从包含initWithNibName:bundle:方法的UIViewController继承而来。

答案 1 :(得分:5)

这个问题有很多答案,所有人基本上都说同样的,正确的事情:不知何故,你试图调用的方法实际上并不存在。

但是,如果你的头撞在墙上(就像我今天一小时一样),请务必先尝试用xcode清理你的项目。有时,我不知道为什么,xcode可能会进入一个糟糕的状态,并且无法正确地将您的项目编译到模拟器中。它会告诉您构建成功,但是当部署到模拟器时,您会开始看到运行时错误,好像只有一半的更改被选中。所以是的,那就发生了。

答案 2 :(得分:2)

您可能没有在ProblemViewController中实现该方法。据我所知,无法识别的选择器只是在该类的接口中没有定义具有该签名的方法。

尝试在您的界面中声明它:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;

答案 3 :(得分:1)

我认为我最好在这个问题上发布一些内容。我打了几天。这方面有很多博客,但没有一个解决了这个问题。有些人认为它与pushViewController有关,需要指定动画:YES。它适用于某些人,但这对我遇到的问题不起作用。我使用一个按钮来访问另一个视图,而不是从表视图中选择一行,但是获得了相同的无法识别的选择器错误。我也在使用导航控制器,所以我认为它与此有关,但事实并非如此。最后,我决定注释掉代码行,直到消息消失。在注释掉导致问题的方法之后,错误消息仍然出现在控制台中。那是我意识到问题不在于我的源代码。一个站点建议执行清理和重建。我尝试了所有这些,但仍然存在问题。然后,我使用Interface Builder查看了我的XIB文件,以查看文件所有者上显示的方法(Received Actions)。有问题。违规方法不仅会在文件所有者上显示一次,而且会显示两次。不知道如何在这里显示这个图像。无论如何,我删除了文件所有者上出现的同名方法(Received Actions)。我执行了一个干净的重建,以查看错误是否消失了。然后我取消注释我认为不好的来源并再次构建项目,并且对新视图的调用成功。

答案 4 :(得分:1)

我将使用相同的错误代码分享我的经验。将对象分配给错误的目标可能会出错。例如,如果您有一些UILabel属性,并且您不小心将字符串常量直接分配给self.myUILabelProperty = @“ups”,那么您的属性将成为NSString类型的对象而不是UILabel,因此您将丢失所有UILabel方法。在那个错误之后,如果你尝试在代码中的属性上使用UIlabel方法,你将收到此错误消息。