应用程序崩溃,错误无法识别选择器发送到实例
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.containerController
是UIViewController
而不是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'