iOS __runtime

什么是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的结合使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值