Runtime学习笔记

作者: 箪食豆羹 | 来源:发表于2017-02-19 17:09 被阅读194次

    参考

    Runtime一小时入门

    如何正确使用Runtime

    什么是Runtime

    Objective-C Runtime是一个将C语言转化为面向对象语言的扩展

    与C++的区别 C++是基于静态类型,而Objective-C是基于动态运行时类型。也就是说用C++编写的程序编译时就直接编译成了可令机器读懂的机器语言;用Objective-C编写的程序不能直接编译成可令机器读懂的机器语言,而是在程序运行的时候,通过Runtime把程序转为可令机器读懂的机器语言。

    Runtime中的元素

    • id和Class

      Class是一个指向objc_class结构体的指针,而id是一个指向objc_object结构体的指针,其中的isa是一个指向objc_class结构体的指针。其中的id就是我们所说的对象,Class就是我们所说的类。

      类与对象的区别:类比对象多了很多特征成员,类也可以当做一个objc_object来对待,也就是说类和对象都是对象,分别称作类对象(class object)和实例对象(instance object),这样我们就可以区别对象和类了。

      isaobjc_object(实例对象)中isa指针指向的类结构称为class(也就是该对象所属的类)其中存放着普通成员变量与动态方法(“-”开头的方法);此处isa指针指向的类结构称为metaclass,其中存放着static类型的成员变量与static类型的方法(“+”开头的方法)。

      super_class: 指向该类的父类的指针,如果该类是根类(如NSObjectNSProxy),那么super_class就为nil

    • SEL

      SELselectorObjective-C中的表示类型。selector可以理解为区别方法的ID。

      结构内含有:名称、类型

    • IMP

      IMP是“implementation”的缩写,它是由编译器生成的一个函数指针。当你发起一个消息后(下文介绍),这个函数指针决定了最终执行哪段代码。

    • Method

      Method代表类中的某个方法的类型。

      结构内含有

      • 方法名method_name类型为SEL
      • 方法类型method_types是一个char指针,存储着方法的参数类型和返回值类型。
      • 方法实现method_imp的类型为IMP
    • Ivar

      Ivar代表类中实例变量的类型

      结构内含有:变量名、变量类型、基地址偏移字节、占用空间

    • objc_property_t

      objc_property_t是属性

      objc_property是内置的类型,与之关联的还有一个objc_property_attribute_t,它是属性的attribute,也就是其实是对属性的详细描述,包括属性名称、属性编码类型、原子类型/非原子类型等。

    • Cache

      缓存

      结构内含有

      • mask: 指定分配cache buckets的总数。在方法查找中,Runtime使用这个字段确定数组的索引位置。
      • occupied: 实际占用cache buckets的总数。
      • buckets: 指定Method数据结构指针的数组。这个数组可能包含不超过mask+1个元素。需要注意的是,指针可能是NULL,表示这个缓存bucket没有被占用,另外被占用的bucket可能是不连续的。这个数组可能会随着时间而增长。
      • objc_msgSend(下文讲解)每调用一次方法后,就会把该方法缓存到cache列表中,下次的时候,就直接优先从cache列表中寻找,如果cache没有,才从methodLists中查找方法。
    • Catagory

      类别

      结构内含有:类别名称、类名称、实例方法列表、类方法列表、协议列表

    传递和转发

    • 消息传递
      1. 检查selector是不是要忽略的
      2. 检查target是否为nil
      3. isa指针查找方法列表,若找不到,则从上一级父类查找,直至根class
      4. 若前三部分都找不到,则进入消息动态解析
    • 消息转发(消息动态解析)
      1. 通过resolveInstanceMethod:方法,决定是否动态添加方法
      2. 进入forwardingTargetForSelector:方法,用于指定备选对象响应这个selector,不能指定为self
      3. 通过methodSignatureForSelector:方法签名,如果返回nil,则消息无法处理
      4. 调用forwardInvocation:方法,如果方法调用成功,则结束。如果失败,则进入doesNotRecognizeSelector:方法,若我们没有实现这个方法,那么就会crash

    应用

    • 字典模型互相转换( json to model)
    • 实现多继承
    • 添加属性,关联对象
    • 动态增加方法
    • isa swizzling
    • method swizzling
    • NSCoding自动归档、解档
    • 面向层面编程

    相关文章

      网友评论

      本文标题:Runtime学习笔记

      本文链接:https://www.haomeiwen.com/subject/epyjwttx.html