- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
第
objc方法声明和实现由于参数类型不一致所引发的崩溃
目录正文分析补充总结
正文
你有注意过objc方法声明处和方法实现处参数类型不一致的情况吗,就像这样:
@interfacePerson:NSObject
-(void)frothTime:(NSInteger)regionTimevalue1:(BOOL)value;
@implementationPerson
-(void)frothTime:(NSInteger)regionTimevalue1:(NSString*)value;
这2个方法除了第2个参数的类型不一样,其它都一样,但一旦调用这个方法就会产生一个坏内存访问的崩溃,这是为什么呢?
这是我在真实项目中遇到的1个很有意思的问题,只要调用分类中的某个方法就百分百崩溃,而且控制台没有任何有用的报错信息,被调用的方法里面的代码也都没有执行,非常难调试,我花了一些时间才弄懂了其中的原理,整理后分享出来,希望能帮到你,崩溃如下图所示:
以下是我简写后的代码,它是一份完整的代码并且可以直接运行。
@interfacePerson:NSObject
-(void)frothTime:(NSInteger)regionTimevalue1:(BOOL)value;
@interfacePerson(Category)
-(void)frothTime:(NSInteger)regionTime;
-(void)frothTime:(NSInteger)regionTimevalue1:(NSString*)value;
@implementationPerson
-(void)frothTime:(NSInteger)regionTimevalue1:(BOOL)value{
NSLog(@%s,__func__);
@implementationPerson(Category)
-(void)frothTime:(NSInteger)regionTime{
[selffrothTime:regionTimevalue1:@111];
-(void)frothTime:(NSInteger)regionTimevalue1:(NSString*)value{
NSLog(@%s,__func__);
intmain(intargc,constchar*argv[]){
Person*p=[[Personalloc]init];
[pfrothTime:123];
return0;
分析
运行代码后,会在-(void)frothTime:(NSInteger)regionTimevalue1:(NSString*)value这行代码处产生一条EXC_BAD_ACCESS崩溃问题,通过打印和断点,可以看出方法内的代码并没有执行,说明是调用这个方法时发生的崩溃,所以可以排除是方法内的代码问题。
崩溃前的代码位置是[selffrothTime:regionTimevalue1:@111,这行代码从表面上看没有任何问题,如果你把示例代码粘贴到xcode中,编译器可能会在这行代码后面给出1个警告:IncompatiblepointertointegerconversionsendingNSString*toparameteroftypeBOOL(akasignedchar),意思是说方法接收的是一个BOOL类型的参数,而你传了一个NSString*类型。
仔细看一下代码,你会发现Person类中声明了-(void)frothTime:(NSInteger)regionTimevalue1:(BOOL)value;,而且分类中也有一个类似的声明-(void)frothTime:(NSInteger)regionTimevalue1:(NSString*)value;,它们除了第2个参数类型不一样,其它都是一样的;熟悉objc的同学应该都知道,objc是没有方法重载的概念,也就是说分类中的方法其实和类中的方法,它们的方法签名都是frothTime:value1:。
现在有2个同名的方法实现,那么[selffrothTime:regionTimevalue1:@111到底调用哪个方法呢?按照xcode给出的提示,似乎是调用-(void)frothTime:(NSInteger)regionTimeval
您可能关注的文档
最近下载
- 2024年城市管理网格员四级-中级理论知识试题及答案.docx VIP
- 2024年城市管理网格员三级(高级)理论知识考试试题及答案.docx VIP
- 2020-2021学年北京师大二附中实验学校九年级上学期期中数学试卷(含解析).pdf VIP
- 2025年城市管理网格员三级(高级)理论知识考试试题及答案.docx VIP
- 压力性尿失禁的护理查房PPT课件.pptx VIP
- 2024-2025学年辽宁铁道职业技术学院单招《英语》试卷及答案详解【典优】.docx VIP
- 辽宁铁道职业技术学院单招考试文化素质数学通关考试题库(完整版)附答案详解.docx VIP
- 学年西城区四中初三上学期期中数学试卷.pdf VIP
- 2019-2020学年北京四中九年级(上)期中数学试卷--含详细解析.docx VIP
- 中国餐饮企业发展报告.pptx VIP
文档评论(0)