iOS runtime 笔记总览

个人已掌握的知识点

  • runtime的一些综述

    • iOS runtime笔记一
    • iOS runtime 笔记二 — Method 介绍及 swizzle
  • runtime的用途

    • swizzle --- 交换,包括

      • isa swizzle 交换两个类(实际上是方法调用时,实例去寻找他的类的指针),典型的用法就是 KVO的实现 iOS runtime 笔记三 — 自定义KVO 的实现逻辑
        KVO的实现即为系统创建一个观察类的子类,以NSKVONotifying_为前缀.同时通过runtimeclass_addMethod去重写那个 proptertysetter方法,完成后,通过
        object_setClass(self, subClass);改变两个类的 isa 指针,达到交换两个类的目的.如下图
        iOS runtime 笔记总览_第1张图片
        示意图

        涉及到的知识点包括
        • 如何动态的创建一个类
        • 如何交换 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
          • @:代表最后一个真正的参数.

      典型的例子就是:不修改一个类的任何代码,通过一个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去交换了NSStringstringWithFormatt方法,但是发现被替换的那个方法,其实被调用了好多次,才执行到了我真正想要他执行的return @"sth"

你可能感兴趣的:(iOS runtime 笔记总览)