iOS __runtime

来源:互联网 发布:java中怎么定义数组 编辑:程序博客网 时间:2024/06/01 19:45

什么是runtime

简单的来说:Runtime就是运行时,一个程序开发的过程通常可以分为以下阶段,编辑-预编译-编译-连接-运行,运行时可以说就是我们的程序再运行的阶段发生的一些事情,在这个阶段程序通常会把一些OC的代码转化成C语言的代码,从而提高执行的效率,在这个阶段我们也可以动态的为某个对象的属性赋值,而对象的属性具体是什么类型也会在这个阶段进行确定(NSString *str = [NSData data]; 其中str在编译的时候是NSString类型,运行的时候是NSData类型)。系统也提供了Runtime的类库,让我们可以直接调用一些运行时把OC代码转化C之后的代码比如:objc_msgSend();同样也可以通过运行时,为分类添加属性,需要用到objc_getAssociatedObject和objc_setAssociatedObject函数
现在我们举个例子来说明一下runtime的使用,我们就拿imageNamed:来说吧,现在我们在工程有可能在多处实现了这个功能,现在我们想讲这里赋值的图片全部更换,如果我们去工程中查找更换会浪费我们很多时间,况且我们无法保证我们全部替换,这是我们就可以使用到runtime,在运行时替换这个方法

实现步骤

首先要给UIImage新建一个category
在.h中声明一个类方法

+(instancetype)imageWithName:(NSString *)name;

在.m中进行实现

+(void)load {    // 获取到imageName方法的地址    Method imageName = class_getClassMethod(self, @selector(imageNamed:));    // 获取到imageWithName方法的地址    Method imageWithName = class_getClassMethod(self, @selector(imageWithName:));    // 交换两个方法的地址    method_exchangeImplementations(imageName, imageWithName);}//不能在分类中重写系统方法imageNamed,因为会把系统的功能给覆盖掉,而且分类中不能调用super.+(instancetype)imageWithName:(NSString *)name {    UIImage *image = [UIImage imageWithName:@"2.jpg"];    if (image == nil) {        NSLog(@"你的图片地址为空");    }    return image;}

这些就是实现的主要代码和思想
如果感兴趣的话,详细代码和思想可以参考:https://github.com/hw2396611405/runtime
同时欢迎大家留言讨论,我们一起学习成长。
在后面我会和大家一起学习runtime的button和block的结合使用

0 0
原创粉丝点击