点击代码生成的按钮触发Unrecognized selector错误,寻求技术排查
解决「unrecognized selector sent to instance」报错的实用排查步骤
先把你遇到的报错信息贴出来方便对照:
-[HomeViewController aMethod:]: unrecognized selector sent to instance 0x102813a00
- Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[HomeViewController aMethod:]: unrecognized selector sent to instance 0x102813a00'
- First throw call stack: (0x184e83164 0x1840cc528 0x184e90628 0x18e7fe188 0x184e88b10 0x184d6dccc 0x184e725cc 0x184...
这个错误说白了就是你的代码在尝试调用HomeViewController实例上根本不存在的aMethod:方法,我整理了几个日常排查这类问题的核心步骤,按顺序走大概率能快速定位:
1. 先确认HomeViewController里真的实现了aMethod:吗?
- 盯紧方法签名:别小看冒号!比如你是不是写了不带参数的
aMethod,但调用的却是带一个参数的aMethod:?或者参数类型声明和调用时的传参逻辑不匹配(不过这个一般不会直接触发unrecognized selector,但也要留意)。 - 检查实现位置:有没有把方法声明写在了
@interface的私有扩展里,但@implementation里漏写了实现?或者手滑把实现代码写到了其他类的@implementation块里? - 混编项目注意:如果是Swift+OC混编,Swift类里的方法要加
@objc修饰才能被OC调用,而且要确认Swift方法在OC里的映射名是否正确——比如Swift的func aMethod(_ param: String)对应OC的aMethod:,别搞混了。
2. 检查按钮的事件绑定是否正确
- 如果你用Storyboard/XIB绑定事件:
打开对应的界面文件,选中按钮,查看「Connections Inspector」里的Touch Up Inside事件,确认是不是绑定到了HomeViewController的aMethod:,有没有误绑定到其他对象,或者方法名拼写错误?
另外也要留意,有没有代码里动态修改过按钮的target?比如写了[button addTarget:otherVC action:@selector(aMethod:) forControlEvents:UIControlEventTouchUpInside],但otherVC根本没有这个方法。 - 如果是纯代码绑定事件:
仔细核对addTarget:action:forControlEvents:这行代码,action的选择器是不是@selector(aMethod:)(别少写冒号!),target是不是正确的HomeViewController实例?
3. 排查对象类型或内存问题
- 确认控制器类型:有没有可能你以为当前页面是
HomeViewController,但实际运行时是其他子类或者被Swizzle过的类?可以在按钮点击前加一行打印:NSLog(@"Current VC class: %@", NSStringFromClass([self class]));,看看真实的类名是什么。 - 检查对象是否被提前释放:这种情况一般会触发野指针,但偶尔也会表现为unrecognized selector。可以用Xcode的Zombies工具排查:Product -> Scheme -> Edit Scheme -> Run -> Diagnostics,勾选Zombies,重新运行后触发错误,会提示你哪个对象被释放后还被调用。
4. 特殊情况排查
- 如果是用分类(Category)给
HomeViewController加的aMethod:,要确认分类文件有没有加入项目的Compile Sources里(Target -> Build Phases -> Compile Sources),有没有被误删或者没勾选? - 有没有宏定义搞鬼?比如某个宏把
aMethod替换成了其他名字,导致你写的方法名和实际调用的不一样?
按照这些步骤一步步查,应该很快能找到问题根源~
内容的提问来源于stack exchange,提问作者Snipe3000
相关产品推荐
相关产品推荐

