【Swift】Swift黑魔法 - Runtime

一、什么是Runtime:
Runtime是苹果开发中比extension更加强大的一项黑科技
extension允许用户在不修改原始代码的情况下,为类增加额外的方法
而Runtime则允许用户在不修改原始代码的情况下,为类增加额外的属性,甚至直接改变原有方法的实现
*Runtime在OC和Swift中都可以使用

二、方法交叉:Method Swizzling
1、为什么要用Method Swizzling
在实际应用中,我们可能会遇到这样的场景:
我们定义了很多Label控件,有些是在xib中定义的,有些是通过代码创建的
在这些Label中,有些使用的是系统默认字体,有些使用的则是自定义字体
然后有一天,设计师突然给了一个新字体,说所有的系统默认字体都应该替换成这个字体
虽然很不爽,但还是花了半天时间把系统中所有的Label字体都修改了一遍(可能有些还有遗漏)
然后又有一天,老板说这个字体不好看!给我换成另外一个字体!于是设计师又给了一个新字体
于是又花了半天时间把所有Label的字体再修改一遍,并且出现了更多的遗漏
就这样,我们浪费了很多时间在改字体上面,最后出来的效果还不尽人意

于是我们就心想,如果有一个方法,能够把所有Label的系统默认字体,都替换成我们想要的新字体该多好啊
这样,不管我们在xib中定义Label还是在代码中创建Label,都直接使用系统默认字体即可
即使要改字体的话,也直接修改这个方法中的字体就行,然后所有Label就都自动改过来了

当然,这个需求是可以实现的,但首先要有解决问题的思路:
思路一:每当程序需要获取系统默认字体时,直接返回我们想要的字体
思路二:每当Label被创建或加载时,判断当前Label的字体是否为系统字体,若是,则修改为我们想要的字体

那么问题来了,无论用哪种思路,都要求必须要修改系统原始控件中的方法,例如
思路一:需要修改UIFont的systemFontOfSize等方法,使其返回指定的字体
思路二:需要修改UILabel的awakeFromNib等方法,将其修改为指定的字体

但是,我们并不能直接修改UIFont和UILabel的代码,那么要如何实现我们想要的效果呢?
这就要用到Runtime中的Method Swizzling机制了

2、什么是Method Swizzling:
Swizzling的中文翻译是“交叉混合”,要想理解Method Swizzling机制,首先需要了解iOS中方法调用的原理

在iOS中,每个方法(或称为函数,下同)都是由方法的声明和方法的实现两部分来构成的
其中,方法的声明就是方法的名称和参数,而方法的实现就是方法中定义的代码
*为了简单起见,在下面的介绍中,方法的声明将简称为方法名,方法的实现将简称为方法体

在正常调用方法的时候,我们通常是将两者作为一个整体调用的,即通过方法名直接调用方法体
但实际上,方法名和方法体是两个不同的对象,方法名的对象类型为Selector,而方法体的对象类型则为Method
当我们调用一个方法时,系统首先会找到该方法对应的Selector,然后再根据Selector找到对应的Method
当然,我们也可以直接提供给系统一个Selector,系统也可以通过该Selector找到对应的Method
但是,如果我们把一个方法的Selector,指向另一个方法的Method,那会怎样呢?

为了理解这个概念,我们首先看看下面这个类:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值