【问题标题】:How do I debug an 'unrecognized selector sent to instance' problem?如何调试“发送到实例的无法识别的选择器”问题?
【发布时间】:2009-03-08 01:29:35
【问题描述】:

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

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

我不知道是什么原因造成的,所以我的问题是:我应该如何最好地调试这个问题?有什么明显的我应该检查的吗?

【问题讨论】:

标签: iphone


【解决方案1】:

检查 ProblemViewController 的基类。我打赌你不是从 UIViewController 继承的,它包括 initWithNibName:bundle: 方法。

【讨论】:

  • 这正是问题所在 - 谢谢!我是从 UIView 继承的。
  • 我在扩展 UITableViewController 时遇到了同样的问题,由于无法更改类,我不知道如何解决。
【解决方案2】:

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

但是,如果您正在碰壁(就像我今天打了一个小时一样),请确保您先尝试在 xcode 中清理您的项目。有时,我不知道为什么,xcode 可能会进入错误状态,无法将您的项目正确编译到模拟器中。它会告诉您构建成功,但是当部署到模拟器时,您开始看到运行时错误,好像只有一半的更改被拾取。所以,是的,这发生了。

【讨论】:

    【解决方案3】:

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

    尝试像这样在你的界面中声明它:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2016-04-25
          • 2013-01-23
          • 2014-11-09
          • 2023-03-14
          • 2019-08-28
          • 2012-07-24
          相关资源
          最近更新 更多