一.可能是头文件问题
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");
网友评论