美文网首页
Objective C运行时(runtime)技术的几个要点总结

Objective C运行时(runtime)技术的几个要点总结

作者: farawei | 来源:发表于2017-02-08 15:39 被阅读20次

做个记录:http://www.cnblogs.com/gugupluto/p/3159733.html#aaaaaaaaaaaaaaaaaaa

有点理解:

运行时 是程序运行的时候,而我们IDE编写程序的时候是 编译环境;

所以其相关的代码,要在程序运行起来的时候才可以看到效果。

目录:

(1)使用class_replaceMethod/class_addMethod函数在运行时对函数进行动态替换或增加新函数

(2)重载forwardingTargetForSelector,将无法处理的selector转发给其他对象

(3)重载resolveInstanceMethod,从而在无法处理某个selector时,动态添加一个selector

(4)使用class_copyPropertyList及property_getName获取类的属性列表及每个属性的名称

   (5) 使用class_copyMethodList获取类的所有方法列表

1.SEL method_getName(Method m) 由Method得到SEL

2.IMP method_getImplementation(Method m)  由Method得到IMP函数指针

3.const char *method_getTypeEncoding(Method m)  由Method得到类型编码信息

4.unsigned int method_getNumberOfArguments(Method m)获取参数个数

5.char *method_copyReturnType(Method m)  得到返回值类型名称

6.IMP method_setImplementation(Method m, IMP imp)  为该方法设置一个新的实现

运行时能干什么:

可以在运行时,在不继承也不category的情况下,为各种类(包括系统的类)做很多操作,具体包括:

增加

增加函数:class_addMethod

增加实例变量:class_addIvar

增加属性:@dynamic标签,或者class_addMethod,因为属性其实就是由getter和setter函数组成

增加Protocol:class_addProtocol (说实话我真不知道动态增加一个protocol有什么用,-_-!!)

获取

获取函数列表及每个函数的信息(函数指针、函数名等等):class_getClassMethod method_getName ...

获取属性列表及每个属性的信息:class_copyPropertyList property_getName

获取类本身的信息,如类名等:class_getName class_getInstanceSize

获取变量列表及变量信息:class_copyIvarList

获取变量的值

替换

将实例替换成另一个类:object_setClass

将函数替换成一个函数实现:class_replaceMethod

直接通过char *格式的名称来修改变量的值,而不是通过变量

看了这么多,怎么去理解了,我的理解是:

可以对照编译环境下,我们是怎么去实现一个方法的调用

例如创建一个类 Car

实现为:

 - (void) theCarName:(nsstring *)name{

NSLog:("this car named %@",name);

}

运行时就是我们利用上面提到的方面,先去拿到需要的例如实例方法,并实现他,等于形式上在这个car类中加入了需要的方法,然后就可以使用新加入的方法。

这里有一个使用运行时解决crash的例子:

http://www.cocoachina.com/ios/20170122/18602.html

相关文章

网友评论

      本文标题:Objective C运行时(runtime)技术的几个要点总结

      本文链接:https://www.haomeiwen.com/subject/gbovittx.html