Runtime应用四 《unrecognized selector sent to instance类型的错误的crash预防措施》

本文探讨了iOS应用中因发送未识别选择器导致的崩溃问题,解析了方法调用的本质——消息发送。当系统在接收者的类及父类中找不到对应方法实现时,会尝试消息转发。文章介绍了两种预防措施:1. 动态添加方法,通过`resolveClassMethod`和`resolveInstanceMethod`实现;2. 消息转发至其他类,创建桩类以接收未实现的方法。并提供了实际代码示例进行测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ViewController testNoProtectCrash]: unrecognized selector sent to instance 0x7fe434607310'

方法调用的本质是消息的发送,系统给ViewController发送消息, 造成该错误的原因是消息接收者的类ViewController中,没有对应的方法testNoProtectCrash的实现,要么是类方法没有实现,要么是实例方法没有实现

/*

* 方法调用的本质是发消息

* 系统调用objc_msgSend给对象发消息

* step1:在消息接收者所属的类中搜寻其方法列表

         如果找到与selector相匹配的方法,就实现selector完成该消息传递

         如果第一步没有在消息接收者所属的类方法列表中搜寻到与selector相匹配的方法

         就去父类中继续查找,如果最终一直无法找到匹配的方法,那么进行第二步消息转发

* step2:简称学会甩锅,把消息抛给其他对象去执行,如果能找到消息备用者,就完成消息转发

         如果找不到消息备用者,就进行第三步

* step3:既不能动态生成实现,也找不到备用者的话,就把消息上报给NSInvocation,由Invocation处理

* 如果三种补救措施都没有预防到,就会产生NSInvalidArgumentException异常

*/

step1:现学方法!

             LRMessageForwardDevelop为自己创建的继承于NSObject的类,如果类方法未实现就会调用resolveClassMethod方法

             如果当前类与消息接收者属于同一类,就动态添加方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值