如何调试“unrecognized selector sent to instance”问题?

6

我在一个视图控制器中有以下代码,除此之外似乎一切正常:

- (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'

我不知道是什么导致了这个问题,所以我的问题是:我应该如何最好地调试这个问题?有什么明显的东西我应该检查吗?


我发现这个非常有帮助:https://dev59.com/omw05IYBdhLWcg3wkivX#7156336 - rbp
5个回答

6

检查ProblemViewController的基类。我猜你没有继承自UIViewController,它包括initWithNibName:bundle:方法。


1
这正是问题所在 - 谢谢!我应该继承自UIView。 - Codebeef
1
当我扩展UITableViewController时,我遇到了相同的问题,但由于无法更改类,我不确定如何解决它。 - jspooner

5

有很多答案都基本上在说同样的正确的事情:某种方式,你试图调用的方法实际上并不存在。

但是,如果你像我今天一样苦思冥想了一个小时,要确保先尝试在xcode中清理你的项目。有时,我不知道为什么,xcode会进入一个糟糕的状态,无法将你的项目正确编译到模拟器中。它会告诉你构建成功,但当部署到模拟器时,你会开始看到运行时错误,就好像只有一半的更改被捡了起来。所以,这种情况可能会发生。


2
你可能没有在ProblemViewController中实现该方法。据我所知,未识别的选择器只是指在此类接口中没有定义具有该签名的方法。
尝试像这样在你的接口中声明它:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;

1
我想我最好在这个问题上发一些东西。我为此奋斗了几天。有很多博客谈到了这个问题,但是没有一个解决了这个问题。有些人建议这与pushViewController需要指定animated:YES有关。对于一些人来说有效,但对于我遇到的问题无效。我使用按钮访问另一个视图而不是从表视图中选择一行,但仍然出现了相同的未识别选择器错误。我还使用了导航控制器,所以我认为它与此有关,但实际上并不是。最后,我决定注释掉代码行,直到消息消失。在注释掉引起问题的方法之后,错误消息仍然出现在控制台中。那时我意识到问题不在我的源代码中。有一个网站建议执行清理和重建操作。我尝试了所有这些,问题仍然存在。然后我使用Interface Builder查看了我的XIB文件,以查看File Owner上显示的方法(接收操作)。问题就在那里。不仅是冒犯的方法在File Owner上显示了一次,而且显示了两次。不知道如何在这里显示这个图像。无论如何,我删除了出现在File Owner上具有相同名称的方法(接收操作)。我执行了清理和重建操作,以查看错误是否消失,结果确实如此。然后我取消注释了我认为有问题的源代码,并再次构建了项目,新视图的调用成功了。

1
我将分享我在处理相同错误代码时的经验。可能会因为将对象分配给错误的目标而犯错。例如,如果您有一些UILabel属性,并且意外地直接将字符串常量分配给self.myUILabelProperty = @"ups",那么您的属性将变成NSString类型的对象,而不是UILabel,因此您将失去所有UILabel方法。在犯下这个错误之后,如果您尝试在代码中使用UIlabel方法来操作该属性,则会收到此错误消息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接