美文网首页iOS LearningruntimeiOS
[iOS] objc_msgSend报错解决

[iOS] objc_msgSend报错解决

作者: objcat | 来源:发表于2016-06-01 16:07 被阅读1495次

一.可能是头文件问题

1.先检查你的类中有没有引入 #import <objc/message.h> 头文件 不要以为引入 #import<objc/runtime.h> 就可以了 = = .

二.其他问题分两种情况

2.1 无参数objc_msgSend

如果成功引入头文件编译还是报错, 这里有两个解决方案

(1)第一种解决方案:
在项目配置文件 -> Build Settings -> Enable Strict Checking of objc_msgSend Calls 这个字段设置为 NO, 默认为YES. 在编译你的项目就会发现问题解决了

 Person *person = [[Person alloc]init];
 objc_msgSend(person, @selector(say)); 

(2)第二种解决方案:

Person *person = [[Person alloc]init]; 
((void (*) (id, SEL)) (void *)objc_msgSend)(person, sel_registerName("say")); 

2.1 有有有! 参数objc_msgSend

(1)第一种解决方案:
在项目配置文件 -> Build Settings -> Enable Strict Checking of objc_msgSend Calls 这个字段设置为 NO, 默认为YES. 在编译你的项目就会发现问题解决了

 Person *person = [[Person alloc]init];
 objc_msgSend(person, @selector(say:), @"hello world"); 

(2)第二种解决方案:

Person *person = [[Person alloc]init]; 
((void (*) (id, SEL, NSString *)) (void *)objc_msgSend)(person, sel_registerName("say", @"hello world")); 

三.内容拓展: 向类objc_msgSend

其实原理一样 如果向类发送消息 必须先获取类对象 需要注意的是 classSay: 必须是+ 开头的类方法才可以 不然找不到就会crash

(1)第一种解决方案:
在项目配置文件 -> Build Settings -> Enable Strict Checking of objc_msgSend Calls 这个字段设置为 NO, 默认为YES. 在编译你的项目就会发现问题解决了

 objc_msgSend([Person class], @selector(classSay:), @"hello world"); 

相关文章

网友评论

本文标题:[iOS] objc_msgSend报错解决

本文链接:https://www.haomeiwen.com/subject/luphdttx.html