个人已掌握的知识点
-
runtime
的一些综述 -
runtime
的用途-
swizzle
--- 交换,包括-
isa swizzle
交换两个类(实际上是方法调用时,实例去寻找他的类的指针),典型的用法就是KVO
的实现 iOS runtime 笔记三 — 自定义KVO 的实现逻辑
KVO
的实现即为系统创建一个观察类的子类,以NSKVONotifying_
为前缀.同时通过runtime
的class_addMethod
去重写那个propterty
的setter
方法,完成后,通过
object_setClass(self, subClass)
;改变两个类的 isa 指针,达到交换两个类的目的.如下图
涉及到的知识点包括- 如何动态的创建一个类
- 如何交换 isa 指针
-
method swizzle
交换两个函数的 IMP 实现.iOS runtime 笔记二 — Method 介绍及 swizzle- 涉及到 method 的概念(是一个包含
SEL
,IMP
的结构体) - 方法调用时, 面向对象方法的实现(IMP)与面向过程函数(function)之间的关系 --- IMP 执行时会去调用 C 语言的函数,但是会多传两个隐藏参数过去. 同时还要告知方法的返回类型和参数.称作
类型编码
.- id 接收消息的对象
- 方法名称 SEL, (SEL _cmd)
- 类型编码 -- 举例说明
class_addMethod(subClass, @selector(setAge:), (IMP)setAge, "v@:@");
这里的 setAge 是一个 setter 方法,也是一个 IMP,当我们需要转化为 func, 那么如上所述,会变成
void(id obj, SEL _cmd, id param)
,那么这里的参数如下所示,都是一一对应的-
v
代表返回类型void
-
@
代表第一个参数,也就是消息的接收对象(或者说方法调用者),他是一个对象类型,因此用@
-
:
代表方法名SEL
-
@
:代表最后一个真正的参数.
-
- 涉及到 method 的概念(是一个包含
典型的例子就是:不修改一个类的任何代码,通过一个
category
中重写load
方法,将原类中的某个 method 的实现进行替换. -
-
遍历一个类中的所有property
- 将数据/一个类进行归档 --- 遍历类中的所有属性,然后一一 archieve. iOS rumtime 笔记五 — 遍历类的属性,进行归档
- 进行 model 转类的操作
- 遍历后,可以对某个类中的私有类(.m 中的 property),利用 KVC 进行赋值.
方法的懒加载 -- 在运行时,给一个类动态的添加方法iOS runtime 笔记四 — Hank 公开课上的笔记
-
疑问
-
isa swizzle
的例子中,我们是为了将setting
方法进行重写,同时绑定新的观察者. 那么,如果是不使用isa swizzle
,直接使用method swizzle
也是可以达到目的的,那么为什么要使用isa swizzle
呢 -
method swizzle
的例子中,我使用category
去交换了NSString
的stringWithFormatt
方法,但是发现被替换的那个方法,其实被调用了好多次,才执行到了我真正想要他执行的return @"sth"