[iOS] objc_msgSend报错解决

一.发现问题

问题1
问题2

二.解决问题

问题1:

检查是否引入 #import <objc/message.h>

问题2:

设置 Build Settings -> Enable Strict Checking of objc_msgSend Calls 为 NO

三.示例

然后再试一下应该就没有什么问题了, 下面送上写法, 这里分为四种无参数无返回值, 无参数有返回值, 有参数无返回值, 有参数有返回值.

每种方法调用又有两种写法, 请欣赏~~

声明

Person *person = [[Person alloc]init];

无参数无返回值

((void (*) (id, SEL)) (void *)objc_msgSend)(person, sel_registerName("say1"));
// 或
objc_msgSend(person, @selector(say1));

无参数有返回值

NSString *say2Return1 = ((NSString *(*) (id, SEL)) (void *)objc_msgSend)(person, sel_registerName("say2"));
NSLog(@"%@", say2Return1);
// 或
NSString *say2Return2 = objc_msgSend(person, @selector(say2));
NSLog(@"%@", say2Return2);

有参数无返回值

((void (*) (id, SEL, NSString *)) (void *)objc_msgSend)(person, sel_registerName("say3:"), @"3333");
// 或
objc_msgSend(person, sel_registerName("say3:"), @"3333");

有参数有返回值

NSString *say4Return1 = ((NSString *(*) (id, SEL, NSString *)) (void *)objc_msgSend)(person, sel_registerName("say4:"), @"4444");
NSLog(@"%@", say4Return1);
// 或
NSString *say4Return2 = objc_msgSend(person, sel_registerName("say4:"), @"4444");
NSLog(@"%@", say4Return2);

finally enjoy it

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容