objc方法声明和实现由于参数类型不一致所引发的崩溃.docx

objc方法声明和实现由于参数类型不一致所引发的崩溃.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 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

文档评论(0)

132****1508 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档