做个记录: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的例子:
网友评论