iOS Runtime

简单写一写个人对Runtime(运行时系统)的理解,个人理解也不是非常的透彻,只是谈一谈自己的看法大部分是网上找的,本人菜鸟一枚

Runtime是Objective-C一门动态语言,程序分为编译时,和运行时.Runtime是运行时OC转换成C的API.OC的函数调用成为消息发送。属于动态调用过程。在编译的时候并不能决定真正调用哪个函数(事实证明,在编译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错。而C语言在编译阶段就会报错)。只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。 runtime属于OC的底层实现,可以进行一些非常底层的操作(OC无法实现的) 1.利用runtime在程序运行的过程中,动态的创建一个类!(KVO底层实现)! 2.利用runtime在程序运行的过程中,动态的为某一个类添加修改 属性\方法! 3.遍历出一个类的所有成员遍历和成员方法!怎么用: 相关的头文件两个常识:

typedef struct objc_method *Method;  成员方法
typedef struct objc_ivar *Ivar;      成员变量

交换方法

交换方法实现的需求场景:自己创建了一个功能性的方法,在项目中多次被引用,当项目的需求发生改变时,要使用另一种功能代替这个功能,要求是不改变旧的项目(也就是不改变原来方法的实现)。可以在类的分类中,再写一个新的方法(是符合新的需求的),然后交换两个方法的实现。这样,在不改变项目的代码,而只是增加了新的代码 的情况下,就完成了项目的改进。

+(void)load{
    // 获取系统类的,URLWithString这个方法而后用自己的方法替换
    Method URLWithStr = class_getClassMethod([NSURL class], @selector(URLWithString:));
    Method LYURLWithStr = class_getClassMethod([NSURL class], @selector(LY_URLWithString:));
    //交换
    method_exchangeImplementations(URLWithStr, LYURLWithStr);
}

+(instancetype)LY_URLWithString:(NSString *)URLStirng
{
NSURL * url = [NSURL LY_URLWithString:URLStirng];//调用了系统的方法了
if (url == nil) {
    NSLog(@"这个url是空");
}
return url;
}


//获取系统方法,包括.m
unsigned int count = 0;
Ivar *lvars =  class_copyIvarList([UIButton class], &count);
    for (int i = 0; i

能力有限,只能写这么多.有什么问题欢迎大家留言指正,我看到一定回复.感谢!!!!!!!

你可能感兴趣的:(iOS Runtime)