应用程序崩溃,错误无法识别选择器发送到实例

Posted

技术标签:

【中文标题】应用程序崩溃,错误无法识别选择器发送到实例【英文标题】:App crashes with error unrecognized selector sent to instance 【发布时间】:2013-12-21 01:01:22 【问题描述】:

我有一个无法识别的选择器发送到实例问题。我知道哪条线路有问题,但我不明白为什么它不能识别它。 (我在创建容器视图时测试了这段代码,它工作得很好。但由于某种原因,当我将它合并到我的主项目时,我收到了这个错误。)

这是我的控制台输出:

2013-12-20 16:47:59.633[8545:70b] -[UIViewController decideViewController:]: unrecognized selector sent to instance 0x8b5c250
2013-12-20 16:47:59.659[8545:70b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIViewController decideViewController:]: unrecognized selector sent to instance 0x8b5c250'
*** First throw call stack:
(
    0   CoreFoundation                      0x01c075e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x0198a8b6 objc_exception_throw + 44
    2   CoreFoundation                      0x01ca4903 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275
    3   CoreFoundation                      0x01bf790b ___forwarding___ + 1019
    4   CoreFoundation                      0x01bf74ee _CF_forwarding_prep_0 + 14
    5   TProduct                          0x0000566f -[GameViewController changeViews:] + 143
    6   TProduct                          0x00005404 -[GameViewController timerTick:] + 532
    7   Foundation                          0x015c1927 __NSFireTimer + 97
    8   CoreFoundation                      0x01bc5bd6 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22
    9   CoreFoundation                      0x01bc55bd __CFRunLoopDoTimer + 1181
    10  CoreFoundation                      0x01bad628 __CFRunLoopRun + 1816
    11  CoreFoundation                      0x01bacac3 CFRunLoopRunSpecific + 467
    12  CoreFoundation                      0x01bac8db CFRunLoopRunInMode + 123
    13  GraphicsServices                    0x0387b9e2 GSEventRunModal + 192
    14  GraphicsServices                    0x0387b809 GSEventRun + 104
    15  UIKit                               0x006f8d3b UIApplicationMain + 1225
    16  TProduct                          0x000070fd main + 141
    17  libdyld.dylib                       0x0224570d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

这是它无法识别的部分 GameViewController.m

-(void)changeViews:(NSString *)gameStateSegueIdentifier

    NSLog(@"show view gameStateSegueIdentifier :%@",gameStateSegueIdentifier);
    [self.containerController decideViewController:gameStateSegueIdentifier];

这就是我调用的方法 ContainerViewController.m

-(void)decideViewController:(NSString *)gameStateSegueIdentifier

    if (gameStateSegueIdentifier == _currentSegueIdentifier) 
        return;
    

    while (gameStateSegueIdentifier != _currentSegueIdentifier) 
        NSLog(@"this is the gameStateSegueIdentifier %@",gameStateSegueIdentifier);
        NSLog(@"this is the currentSegueIdentifier %@",_currentSegueIdentifier);

        [self changeViewControllers];
    

我知道已经有很多“无法识别的选择器发送到实例”问题。但到目前为止,我无法为我的案子找到答案。感谢您的帮助。

【问题讨论】:

添加日志消息以打印self.containerController 的值。该错误说它是UIViewController,而不是您认为应该是的任何子类。该属性是如何分配的? @PhillipMills, 2013-12-20 17:17:31.051 TProduct[8957:70b] value of the self.containerController <UIViewController: 0x8ad6520> and this is how the property is created in the GameViewController.m @property(nonatomic,weak)ContainerViewController *containerController;` 这很简单。不知何故,您将指向 UIViewController 的指针转换为指向支持 decideViewController 方法的某个类的指针。但 UIViewController 不支持该方法。大概指针是self.containerController,而你在初始化它时出错了。 @Matt 请注意,您向我展示了如何声明属性,而不是如何将对象分配给它。可能这里的关键区别...... @HotLicks,我实际上仍然对“不知何故”部分感兴趣。 @property (nonatomic,weak)ContainerViewController *containerViewController; 因为当我 cmd+单击此属性时,我看到我的 containerviewclass 不是别的东西。只是为了确保我从另一个项目中复制了相同的代码,只是为了确保我没有忘记任何东西。但我仍然看到-[UIViewController decideViewController:]: 【参考方案1】:

您收到的错误消息解释了问题:

2013-12-20 16:47:59.633[8545:70b] -[UIViewController decideViewController:]: unrecognized selector sent to instance 0x8b5c250

这告诉你UIViewController 类的一个实例收到了decideViewController: 的消息。 UIViewController 不响应此消息。所以,似乎self.containerControllerUIViewController 而不是ContainerViewController。 (如果是ContainerViewController,它会在错误消息中这样写。)

该属性被声明为ContainerViewController 的事实并不意味着其中实际上有一个ContainerViewController。转到您实际创建此对象的位置并将其分配给该属性,并确保您将其创建为正确的类。

【讨论】:

好点,我只是在我创建它的另一个项目中打印出self.containerViewController,正如你提到的,它不是uiviewcontroller:the same method in a different project <ContainerViewController: 0x8b76c60>。但是我在合并时做了同样的程序,太奇怪了【参考方案2】:

当未识别选择器时,您无需显示选择器的代码,因为它未执行。

显示容器控制器的属性行。

    您是否 100% 确定 self.containerController 是 ContainerViewController,您的错误消息显示 UIViewController,所以您正在做一些特殊的事情,例如集群或类别?

    你在使用#import "ContainerViewController"吗?

    方法在@implementation @end 部分吗?

【讨论】:

似乎有一些关于失败可能原因的建议,而不是答案。你为什么不试试评论呢。 GameViewController中containerController的属性行:@property(nonatomic,weak)ContainerViewController *containerController; 1.是的,我确定,否则我将无法看到我正在调用的方法。 ContainerViewController 是 UIViewController 2 的子类。是的,我正在使用 #import "ContainerViewController",否则我将无法创建属性声明。 3. 我没明白你的意思

以上是关于应用程序崩溃,错误无法识别选择器发送到实例的主要内容,如果未能解决你的问题,请参考以下文章

快速谓词导致错误无法识别选择器发送到实例 0x156c9580'

应用程序崩溃,无法识别的选择器发送到实例 - 可能是骗局

[标签比较:]:无法识别的选择器发送到实例

iPhone:“无法识别的选择器已发送到实例”错误

从实用程序应用导航控制器视图发送到实例错误的无法识别的选择器

ios 7无法识别的选择器发送到实例