请大家放心,以下所有Runtime实战篇,在最后都会分享Demo给大家!
一、问好篇
见到我们广大的粉丝们,第一反应当然是:大家好!
#if TARGET_IPHONE_SIMULATOR
#import <objc/objc-runtime.h>
#else
#import <objc/runtime.h>
#import <objc/message.h>
#endif
//自定义一个方法
voidsayFunction(idself,SEL_cmd,idsome) {
NSLog(@"%@岁的%@说:%@",object_getIvar(self,class_getInstanceVariable([selfclass],"_age")),[selfvalueForKey:@"name"],some);
}
int main(intargc,constchar* argv[]) {
@autoreleasepool{
//动态创建对象创建一个People继承自NSObject类
Class TLPeople =objc_allocateClassPair([NSObjectclass],"People",0);
//为该类添加NSString *_name成员变量
class_addIvar(TLPeople,"_name",sizeof(NSString*),log2(sizeof(NSString*)),@encode(NSString*));
//为该类添加int _age成员变量
class_addIvar(TLPeople,"_age",sizeof(int),sizeof(int),@encode(int));
//注册方法名为say的方法
SELselSay =sel_registerName("say:");
//为该类增加名为say的方法
class_addMethod(TLPeople, selSay, (IMP)sayFunction,"v@:@");
//注册该类
objc_registerClassPair(TLPeople);
//创建一个类的实例
id tlPeopleInstance = [[TLPeoplealloc]init];
// KVC动态改变对象peopleInstance中的实例变量
[tlPeopleInstancesetValue:@"TridonLee"forKey:@"name"];
//从类中获取成员变量Ivar
IvarageIvar =class_getInstanceVariable(TLPeople,"_age");
//为tlPeopleInstance的成员变量赋值
object_setIvar(tlPeopleInstance, ageIvar,@18);
//调用tlPeopleInstance对象中的selSay方法选择器对于的方法
//objc_msgSend(tlPeopleInstance, selSay, @"大家好!"); //这样写也可以
((void(*)(id,SEL,id))objc_msgSend)(tlPeopleInstance, selSay,@"大家好");
tlPeopleInstance =nil;//当TLPeople类或者它的子类的实例还存在,则不能调用objc_disposeClassPair这个方法;因此这里要先销毁实例对象后才能销毁类;
//销毁类
objc_disposeClassPair(TLPeople);
}
return0;
}
最后的结果是:18岁的TridonLee说:大家好!
在使用objc_msgSend(peopleInstance,s,@"大家好!");
默认会出现以下错误:
objc_msgSend()报错Too many arguments to function call ,expected 0,have3
直接通过objc_msgSend(self, setter, value)是报错,说参数过多。
请这样解决:
Build Setting–> Apple LLVM 7.0 – Preprocessing–> Enable Strict Checking of objc_msgSend Calls 改为 NO
当然你也可以这样写(推荐):
((void(*)(id,SEL,id))objc_msgSend)(peopleInstance,s,@"大家好");
强制转换objc_msgSend函数类型为带三个参数且返回值为void函数,然后才能传三个参数。
此实战内容是,动态创建一个类,并创建成员变量和方法,最后赋值成员变量并发送消息。其中成员变量的赋值使用了KVC和object_setIvar函数两种方式,这些东西大家举一反三就可以了。
Demo传送门->3.1问好篇Demo