RunTime详解

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;

 }

```

参考:

https://juejin.im/post/5cd0ed2251882540a714d475

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容