RunTime --> ISA指针

RunTime

  • OC是一门动态性比较强的编程语言,和C,C++等语言有很大的不同.
  • OC的动态性是由RuntimeAPI来支撑的.
  • Runtime API提供的接口基本都是C语言的,源码有C/C++/汇编语言编写.
    编写代码 --> 编译链接 --> 运行.OC语言可以在运行的过程中动态的修改方法实现,动态添加方法实现.

ISA指针

  • arm64架构之前,isa就是一个普通的指针,存储着ClassMeta-Class对象的内存地址
  • arm64架构开始,对isa进行了优化,变成了一个共用体(union)结构,还使用位域来存储更多的信息

instance对象的isa & ISA_MASK得到class对象.
class对象的isa & ISA_MASK得到Meta-class对象.

image.png

isa详解 – 位域

nonpointer

  • 0,代表普通的指针,存储着Class、Meta-Class对象的内存地址
  • 1,代表优化过,使用位域存储更多的信息

has_assoc

  • 是否有设置过关联对象,如果没有,释放时会更快

has_cxx_dtor

  • 是否有C++的析构函数(.cxx_destruct),如果没有,释放时会更快

shiftcls

  • 存储着Class、Meta-Class对象的内存地址信息

magic

用于在调试时分辨对象是否未完成初始化

weakly_referenced

  • 是否有被弱引用指向过,如果没有,释放时会更快

deallocating

  • 对象是否正在释放

extra_rc

  • 里面存储的值是引用计数器减1

has_sidetable_rc

  • 引用计数器是否过大无法存储在isa中
  • 如果为1,那么引用计数会存储在一个叫SideTable的类的属性中

Bool类型属性的Getter

@property (nonatomic,assign,getter=isTall) BOOL tall;
通过两次取反!!number 强制转换成Bool类型.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容