https://github.com/garnett/DLIntrospection 打印RunTime信息
1.实例对象是类的实例,类作为对象又是元类的实例。类也是对象一种。元类是类对象的类,类对象是元类的实例。 isa指向元类。
最终都是转成了runtime库的东西,比如类转成了runtime库里面的结构体等数据类型,方法转成了runtime库里面的C语言函数,平时调方法都是转成了objc_msgSend函数(所以说OC有个消息发送机制)
class_copyIvarList : 获得某个类内部的所有成员变量
class_copyMethodList : 获得某个类内部的所有方法
class_getInstanceMethod : 获得某个具体的实例方法(对象方法,减号开头)
class_getClassMethod : 获得某个具体的类方法 (加号)
method_exchangeImplementations : 交换2个方法的实现
#import 消息机制
objc_msgSend(...);
1.直接再main.m去掉头文件,改造main.m 写几个简单函数.观察一下。
clang -rewrite-objc main.m 再该目录下会生成main.cpp
2.xcode6以上开启runtime 设置页面,搜索msg,设为no
runtime 可以调用私有方法。
objc_msgSend(model,sel_registerName("log"));
objc_msgSend(model,@selector(log));
objc_msgSend(model,@selector(log:),@"我爱罗");
3.方法调用流程
每一个对象本质上都是一个类的实例。其中类定义了成员变量和成员方法的列表。对象通过对象的isa指针指向类。
每一个类本质上都是一个对象,类其实是元类(meteClass)的实例。元类定义了类方法的列表。类通过类的isa指针指向元类。
所有的元类最终继承一个根元类,根元类isa指针指向本身,形成一个封闭的内循环。
通过isa去查找注册方法编号,再从方法编号去methodlist查找。
4.runtime动态添加方法performSelector
```
使用runtime动态添加方法。eg.oc懒加载机制,只要一个方法实现,立马添加方法列表。
+(BOOL)resolveInstanceMethod:(SEL)sel
调用一个未实现的方法 就会走到这里。处理动态添加,未处理的方法。
_cmd:当前方法编号
voidaddMethod(idself,SEL_cmd)
{
NSLog(@"isSaleOut");
}
voidaddMethodText(idself,SEL_cmd,NSString*text)
{
NSLog(@"isSaleOut:%@",text);
}
+(BOOL)resolveInstanceMethod:(SEL)sel
{
NSLog(@"resolveInstanceMethod::%@",NSStringFromSelector(sel));
if(sel==NSSelectorFromString(@"isSaleOut"))
{
class_addMethod(self, sel,(IMP)addMethod,"v@:");
returnYES;
}elseif(sel==NSSelectorFromString(@"isSaleOut:"))
{
class_addMethod(self, sel,(IMP)addMethodText,"v@:*");
returnYES;
}
return[superresolveInstanceMethod:sel];
}
```
5.runtime动态添加属性
六.
```
+ (Class)class{ return self; }
- (Class)class{return object_getClass(self); }
//
Classobject_getClass(id obj){
if(obj) returnobj->getIsa();
else returnNil;
}
```
参考: