区块链技术博客
www.b2bchain.cn

isa 的分析求职学习资料

本文介绍了isa 的分析求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

对象本质探究让我们知道对象的第一个变量就是isa,在探究 IOS 底层原理之 alloc 探究 中我们发现alloc一个对象最核心的三个方法

  • cls->instanceSize 计算内存大小 ,

  • (id)calloc(1, size) 开辟内存返回地址指针,

  • obj->initInstanceIsa 初始化isa关联类。

既然这么多地方都指向isa,那么就来探究下isa的结构以及isa是如何关联类的。

isa 结构

通过alloc流程

alloc –> _objc_rootAlloc –> callAlloc –> _objc_rootAllocWithZone –> _class_createInstanceFromZone,断点在 obj->initInstanceIsa,进入 obj->initInstanceIsa

inline void  objc_object::initInstanceIsa(Class cls, bool hasCxxDtor) {     ASSERT(!cls->instancesRequireRawIsa());     ASSERT(hasCxxDtor == cls->hasCxxDtor());      initIsa(cls, true, hasCxxDtor); }

断点进入initIsa

inline void  objc_object::initIsa(Class cls, bool nonpointer, UNUSED_WITHOUT_INDEXED_ISA_AND_DTOR_BIT bool hasCxxDtor) {      ASSERT(!isTaggedPointer());       isa_t newisa(0); // isa初始化      if (!nonpointer) {         newisa.setClass(cls, this);//如果是纯指针 isa被直接cls赋值     } else {         ASSERT(!DisableNonpointerIsa);        ASSERT(!cls->instancesRequireRawIsa()); #if SUPPORT_INDEXED_ISA         ASSERT(cls->classArrayIndex() > 0);         newisa.bits = ISA_INDEX_MAGIC_VALUE;         newisa.has_cxx_dtor = hasCxxDtor;         newisa.indexcls = (uintptr_t)cls->classArrayIndex(); #else            newisa.bits = ISA_MAGIC_VALUE; #   if ISA_HAS_CXX_DTOR_BIT         newisa.has_cxx_dtor = hasCxxDtor; #   endif         newisa.setClass(cls, this); #endif         newisa.extra_rc = 1;     }     isa = newisa; }

我们发现了isa的结构类型是isa_t,进入isa_t

union isa_t {     isa_t() { }     isa_t(uintptr_t value) : bits(value) { }      uintptr_t bits;  private:     // Accessing the class requires custom ptrauth operations, so     // force clients to go through setClass/getClass by making this     // private.     Class cls;  public: #if defined(ISA_BITFIELD)     struct {         ISA_BITFIELD;  // defined in isa.h     };      bool isDeallocating() {         return extra_rc == 0 && has_sidetable_rc == 0;     }     void setDeallocating() {         extra_rc = 0;         has_sidetable_rc = 0;     } #endif      void setClass(Class cls, objc_object *obj);     Class getClass(bool authenticated);     Class getDecodedClass(bool authenticated); };

源码分析:

isa_t是联合体。isa_t有两个变量 一个是bits,一个是cls。通过上面分析联合体是互斥的,那就意味着初始化isa有两种方式:

  • bits被赋值,cls 没有值或者被覆盖
  • cls 被赋值,bits没有值或者被覆盖

isa_t中还有一个结构体成员变量ISA_BITFIELD。这是一个宏对应有两个端,一个是__arm64__(iOS),一个是__x86_64__(macOS)ISA_BITFIELD通过位域存储信息,那就具体看下有哪些信息

isa 的分析

图中的省略了iOS的模拟器数据只留下了真机和macOS的宏

bits的64位存储分布图

isa 的分析

各变量的含义:

对象本质探究让我们知道对象的第一个变量就是isa,在探究 IOS 底层原理之 alloc 探究 中我们发现alloc一个对象最核心的三个方法

  • cls->instanceSize 计算内存大小 ,

  • (id)calloc(1, size) 开辟内存返回地址指针,

  • obj->initInstanceIsa 初始化isa关联类。

既然这么多地方都指向isa,那么就来探究下isa的结构以及isa是如何关联类的。

isa 结构

通过alloc流程

alloc –> _objc_rootAlloc –> callAlloc –> _objc_rootAllocWithZone –> _class_createInstanceFromZone,断点在 obj->initInstanceIsa,进入 obj->initInstanceIsa

inline void  objc_object::initInstanceIsa(Class cls, bool hasCxxDtor) {     ASSERT(!cls->instancesRequireRawIsa());     ASSERT(hasCxxDtor == cls->hasCxxDtor());      initIsa(cls, true, hasCxxDtor); }

断点进入initIsa

inline void  objc_object::initIsa(Class cls, bool nonpointer, UNUSED_WITHOUT_INDEXED_ISA_AND_DTOR_BIT bool hasCxxDtor) {      ASSERT(!isTaggedPointer());       isa_t newisa(0); // isa初始化      if (!nonpointer) {         newisa.setClass(cls, this);//如果是纯指针 isa被直接cls赋值     } else {         ASSERT(!DisableNonpointerIsa);        ASSERT(!cls->instancesRequireRawIsa()); #if SUPPORT_INDEXED_ISA         ASSERT(cls->classArrayIndex() > 0);         newisa.bits = ISA_INDEX_MAGIC_VALUE;         newisa.has_cxx_dtor = hasCxxDtor;         newisa.indexcls = (uintptr_t)cls->classArrayIndex(); #else            newisa.bits = ISA_MAGIC_VALUE; #   if ISA_HAS_CXX_DTOR_BIT         newisa.has_cxx_dtor = hasCxxDtor; #   endif         newisa.setClass(cls, this); #endif         newisa.extra_rc = 1;     }     isa = newisa; }

我们发现了isa的结构类型是isa_t,进入isa_t

union isa_t {     isa_t() { }     isa_t(uintptr_t value) : bits(value) { }      uintptr_t bits;  private:     // Accessing the class requires custom ptrauth operations, so     // force clients to go through setClass/getClass by making this     // private.     Class cls;  public: #if defined(ISA_BITFIELD)     struct {         ISA_BITFIELD;  // defined in isa.h     };      bool isDeallocating() {         return extra_rc == 0 && has_sidetable_rc == 0;     }     void setDeallocating() {         extra_rc = 0;         has_sidetable_rc = 0;     } #endif      void setClass(Class cls, objc_object *obj);     Class getClass(bool authenticated);     Class getDecodedClass(bool authenticated); };

源码分析:

isa_t是联合体。isa_t有两个变量 一个是bits,一个是cls。通过上面分析联合体是互斥的,那就意味着初始化isa有两种方式:

  • bits被赋值,cls 没有值或者被覆盖
  • cls 被赋值,bits没有值或者被覆盖

isa_t中还有一个结构体成员变量ISA_BITFIELD。这是一个宏对应有两个端,一个是__arm64__(iOS),一个是__x86_64__(macOS)ISA_BITFIELD通过位域存储信息,那就具体看下有哪些信息

isa 的分析

图中的省略了iOS的模拟器数据只留下了真机和macOS的宏

bits的64位存储分布图

isa 的分析

各变量的含义:

对象本质探究让我们知道对象的第一个变量就是isa,在探究 IOS 底层原理之 alloc 探究 中我们发现alloc一个对象最核心的三个方法

  • cls->instanceSize 计算内存大小 ,

  • (id)calloc(1, size) 开辟内存返回地址指针,

  • obj->initInstanceIsa 初始化isa关联类。

既然这么多地方都指向isa,那么就来探究下isa的结构以及isa是如何关联类的。

isa 结构

通过alloc流程

alloc –> _objc_rootAlloc –> callAlloc –> _objc_rootAllocWithZone –> _class_createInstanceFromZone,断点在 obj->initInstanceIsa,进入 obj->initInstanceIsa

inline void  objc_object::initInstanceIsa(Class cls, bool hasCxxDtor) {     ASSERT(!cls->instancesRequireRawIsa());     ASSERT(hasCxxDtor == cls->hasCxxDtor());      initIsa(cls, true, hasCxxDtor); }

断点进入initIsa

inline void  objc_object::initIsa(Class cls, bool nonpointer, UNUSED_WITHOUT_INDEXED_ISA_AND_DTOR_BIT bool hasCxxDtor) {      ASSERT(!isTaggedPointer());       isa_t newisa(0); // isa初始化      if (!nonpointer) {         newisa.setClass(cls, this);//如果是纯指针 isa被直接cls赋值     } else {         ASSERT(!DisableNonpointerIsa);        ASSERT(!cls->instancesRequireRawIsa()); #if SUPPORT_INDEXED_ISA         ASSERT(cls->classArrayIndex() > 0);         newisa.bits = ISA_INDEX_MAGIC_VALUE;         newisa.has_cxx_dtor = hasCxxDtor;         newisa.indexcls = (uintptr_t)cls->classArrayIndex(); #else            newisa.bits = ISA_MAGIC_VALUE; #   if ISA_HAS_CXX_DTOR_BIT         newisa.has_cxx_dtor = hasCxxDtor; #   endif         newisa.setClass(cls, this); #endif         newisa.extra_rc = 1;     }     isa = newisa; }

我们发现了isa的结构类型是isa_t,进入isa_t

union isa_t {     isa_t() { }     isa_t(uintptr_t value) : bits(value) { }      uintptr_t bits;  private:     // Accessing the class requires custom ptrauth operations, so     // force clients to go through setClass/getClass by making this     // private.     Class cls;  public: #if defined(ISA_BITFIELD)     struct {         ISA_BITFIELD;  // defined in isa.h     };      bool isDeallocating() {         return extra_rc == 0 && has_sidetable_rc == 0;     }     void setDeallocating() {         extra_rc = 0;         has_sidetable_rc = 0;     } #endif      void setClass(Class cls, objc_object *obj);     Class getClass(bool authenticated);     Class getDecodedClass(bool authenticated); };

源码分析:

isa_t是联合体。isa_t有两个变量 一个是bits,一个是cls。通过上面分析联合体是互斥的,那就意味着初始化isa有两种方式:

  • bits被赋值,cls 没有值或者被覆盖
  • cls 被赋值,bits没有值或者被覆盖

isa_t中还有一个结构体成员变量ISA_BITFIELD。这是一个宏对应有两个端,一个是__arm64__(iOS),一个是__x86_64__(macOS)ISA_BITFIELD通过位域存储信息,那就具体看下有哪些信息

isa 的分析

图中的省略了iOS的模拟器数据只留下了真机和macOS的宏

bits的64位存储分布图

isa 的分析

各变量的含义:

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » isa 的分析求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们