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

类的分析-类结构分析求职学习资料

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

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

类的基本结构

根据前面的篇章,我们发现isaClass类型的。Class类型是objc_class *objc_class是一个结构体。 所有的Class底层实现都是objc_class。在 objc4-818.2 中全局搜索objc_class 代码如下

struct objc_class {     Class _Nonnull isa  OBJC_ISA_AVAILABILITY;  #if !__OBJC2__     Class _Nullable super_class                              OBJC2_UNAVAILABLE;     const char * _Nonnull name                               OBJC2_UNAVAILABLE;     long version                                             OBJC2_UNAVAILABLE;     long info                                                OBJC2_UNAVAILABLE;     long instance_size                                       OBJC2_UNAVAILABLE;     struct objc_ivar_list * _Nullable ivars                  OBJC2_UNAVAILABLE;     struct objc_method_list * _Nullable * _Nullable methodLists                    OBJC2_UNAVAILABLE;     struct objc_cache * _Nonnull cache                       OBJC2_UNAVAILABLE;     struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE; #endif  } OBJC2_UNAVAILABLE; // OBJC2 不可用

现在正常的都是OBJC2,上面的定义的objc_classOBJC2不可用

struct objc_class : objc_object {      ...     // Class ISA;     Class superclass;     cache_t cache;             // formerly cache pointer and vtable     class_data_bits_t bits;    // class_rw_t * plus custom rr/alloc flags      //下面是一些方法省略 };

源码分析objc_class继承objc_objectobjc_object里面只有一个成员变量isaisa具体是作用已经探究过。下面的三个成员变量具体的作用还无从得知,怎么去探究它呢?类的地址是知道的,那么就根据上面探究过的首地址+偏移值来获取里面的成员变量的地址,然后获取值。但是偏移值需要知道当前变量之前的所有成员变量的大小

  • isa 结构体指针占8字节
  • Class superclass 也是结构体指针占8字节
  • cache_t cache是结构体类型的大小,由结构体内成员变量决定
  • class_data_bits_t bits 知道前面三个成员变量大小,就可以得到bits的地址

只要知道cache_t的内存大小,objc_class的所有的成员变量都可以获取到相应的地址,探究下cache_t内存大小

typedef unsigned long           uintptr_t;  #if __LP64__ typedef uint32_t mask_t;  // x86_64 & arm64 asm are less efficient with 16-bits #else typedef uint16_t mask_t; #endif  struct cache_t { private:     explicit_atomic<uintptr_t> _bucketsAndMaybeMask; // 8     union {         struct {             explicit_atomic<mask_t>    _maybeMask;   // 4 #if __LP64__             uint16_t                   _flags;       // 2 #endif             uint16_t                   _occupied;    // 2         };         explicit_atomic<preopt_cache_t *> _originalPreoptCache; //8     };      //下面是一些方法省略 };
  • cache_t 是结构体类型,有两个成员变量_bucketsAndMaybeMask和一个联合体

  • _bucketsAndMaybeMaskuintptr_t无符长整型占8字节

  • 联合体里面有两个成员变量结构体_originalPreoptCache,联合体的内存大小由成员变量中的最大变量类型决定

  • _originalPreoptCache 是结构体指针占8字节

  • 结构体中有_maybeMask_flags_occupied_maybeMaskuint32_t4字节_flags_occupieduint16_t 各占2字节,结构体大小是8字节

  • cache_t的内存大小是 8+8 或者是8+4+2+2都是16字节

探究类里面的各个成员变量,成员变量的内存地址如下

  • isa的内存地址是首地址,前面的博客已经探究了
  • superclass的内存地址是首地址+0x8
  • cache的内存地址是首地址+0x10
  • bits的内存地址是首地址+0x20

类的基本结构

根据前面的篇章,我们发现isaClass类型的。Class类型是objc_class *objc_class是一个结构体。 所有的Class底层实现都是objc_class。在 objc4-818.2 中全局搜索objc_class 代码如下

struct objc_class {     Class _Nonnull isa  OBJC_ISA_AVAILABILITY;  #if !__OBJC2__     Class _Nullable super_class                              OBJC2_UNAVAILABLE;     const char * _Nonnull name                               OBJC2_UNAVAILABLE;     long version                                             OBJC2_UNAVAILABLE;     long info                                                OBJC2_UNAVAILABLE;     long instance_size                                       OBJC2_UNAVAILABLE;     struct objc_ivar_list * _Nullable ivars                  OBJC2_UNAVAILABLE;     struct objc_method_list * _Nullable * _Nullable methodLists                    OBJC2_UNAVAILABLE;     struct objc_cache * _Nonnull cache                       OBJC2_UNAVAILABLE;     struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE; #endif  } OBJC2_UNAVAILABLE; // OBJC2 不可用

现在正常的都是OBJC2,上面的定义的objc_classOBJC2不可用

struct objc_class : objc_object {      ...     // Class ISA;     Class superclass;     cache_t cache;             // formerly cache pointer and vtable     class_data_bits_t bits;    // class_rw_t * plus custom rr/alloc flags      //下面是一些方法省略 };

源码分析objc_class继承objc_objectobjc_object里面只有一个成员变量isaisa具体是作用已经探究过。下面的三个成员变量具体的作用还无从得知,怎么去探究它呢?类的地址是知道的,那么就根据上面探究过的首地址+偏移值来获取里面的成员变量的地址,然后获取值。但是偏移值需要知道当前变量之前的所有成员变量的大小

  • isa 结构体指针占8字节
  • Class superclass 也是结构体指针占8字节
  • cache_t cache是结构体类型的大小,由结构体内成员变量决定
  • class_data_bits_t bits 知道前面三个成员变量大小,就可以得到bits的地址

只要知道cache_t的内存大小,objc_class的所有的成员变量都可以获取到相应的地址,探究下cache_t内存大小

typedef unsigned long           uintptr_t;  #if __LP64__ typedef uint32_t mask_t;  // x86_64 & arm64 asm are less efficient with 16-bits #else typedef uint16_t mask_t; #endif  struct cache_t { private:     explicit_atomic<uintptr_t> _bucketsAndMaybeMask; // 8     union {         struct {             explicit_atomic<mask_t>    _maybeMask;   // 4 #if __LP64__             uint16_t                   _flags;       // 2 #endif             uint16_t                   _occupied;    // 2         };         explicit_atomic<preopt_cache_t *> _originalPreoptCache; //8     };      //下面是一些方法省略 };
  • cache_t 是结构体类型,有两个成员变量_bucketsAndMaybeMask和一个联合体

  • _bucketsAndMaybeMaskuintptr_t无符长整型占8字节

  • 联合体里面有两个成员变量结构体_originalPreoptCache,联合体的内存大小由成员变量中的最大变量类型决定

  • _originalPreoptCache 是结构体指针占8字节

  • 结构体中有_maybeMask_flags_occupied_maybeMaskuint32_t4字节_flags_occupieduint16_t 各占2字节,结构体大小是8字节

  • cache_t的内存大小是 8+8 或者是8+4+2+2都是16字节

探究类里面的各个成员变量,成员变量的内存地址如下

  • isa的内存地址是首地址,前面的博客已经探究了
  • superclass的内存地址是首地址+0x8
  • cache的内存地址是首地址+0x10
  • bits的内存地址是首地址+0x20

类的基本结构

根据前面的篇章,我们发现isaClass类型的。Class类型是objc_class *objc_class是一个结构体。 所有的Class底层实现都是objc_class。在 objc4-818.2 中全局搜索objc_class 代码如下

struct objc_class {     Class _Nonnull isa  OBJC_ISA_AVAILABILITY;  #if !__OBJC2__     Class _Nullable super_class                              OBJC2_UNAVAILABLE;     const char * _Nonnull name                               OBJC2_UNAVAILABLE;     long version                                             OBJC2_UNAVAILABLE;     long info                                                OBJC2_UNAVAILABLE;     long instance_size                                       OBJC2_UNAVAILABLE;     struct objc_ivar_list * _Nullable ivars                  OBJC2_UNAVAILABLE;     struct objc_method_list * _Nullable * _Nullable methodLists                    OBJC2_UNAVAILABLE;     struct objc_cache * _Nonnull cache                       OBJC2_UNAVAILABLE;     struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE; #endif  } OBJC2_UNAVAILABLE; // OBJC2 不可用

现在正常的都是OBJC2,上面的定义的objc_classOBJC2不可用

struct objc_class : objc_object {      ...     // Class ISA;     Class superclass;     cache_t cache;             // formerly cache pointer and vtable     class_data_bits_t bits;    // class_rw_t * plus custom rr/alloc flags      //下面是一些方法省略 };

源码分析objc_class继承objc_objectobjc_object里面只有一个成员变量isaisa具体是作用已经探究过。下面的三个成员变量具体的作用还无从得知,怎么去探究它呢?类的地址是知道的,那么就根据上面探究过的首地址+偏移值来获取里面的成员变量的地址,然后获取值。但是偏移值需要知道当前变量之前的所有成员变量的大小

  • isa 结构体指针占8字节
  • Class superclass 也是结构体指针占8字节
  • cache_t cache是结构体类型的大小,由结构体内成员变量决定
  • class_data_bits_t bits 知道前面三个成员变量大小,就可以得到bits的地址

只要知道cache_t的内存大小,objc_class的所有的成员变量都可以获取到相应的地址,探究下cache_t内存大小

typedef unsigned long           uintptr_t;  #if __LP64__ typedef uint32_t mask_t;  // x86_64 & arm64 asm are less efficient with 16-bits #else typedef uint16_t mask_t; #endif  struct cache_t { private:     explicit_atomic<uintptr_t> _bucketsAndMaybeMask; // 8     union {         struct {             explicit_atomic<mask_t>    _maybeMask;   // 4 #if __LP64__             uint16_t                   _flags;       // 2 #endif             uint16_t                   _occupied;    // 2         };         explicit_atomic<preopt_cache_t *> _originalPreoptCache; //8     };      //下面是一些方法省略 };
  • cache_t 是结构体类型,有两个成员变量_bucketsAndMaybeMask和一个联合体

  • _bucketsAndMaybeMaskuintptr_t无符长整型占8字节

  • 联合体里面有两个成员变量结构体_originalPreoptCache,联合体的内存大小由成员变量中的最大变量类型决定

  • _originalPreoptCache 是结构体指针占8字节

  • 结构体中有_maybeMask_flags_occupied_maybeMaskuint32_t4字节_flags_occupieduint16_t 各占2字节,结构体大小是8字节

  • cache_t的内存大小是 8+8 或者是8+4+2+2都是16字节

探究类里面的各个成员变量,成员变量的内存地址如下

  • isa的内存地址是首地址,前面的博客已经探究了
  • superclass的内存地址是首地址+0x8
  • cache的内存地址是首地址+0x10
  • bits的内存地址是首地址+0x20

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

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

评论 抢沙发

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

b2b链

联系我们联系我们