003-iOS 对象的本质和isa探索

2020-09-21  本文已影响0人  A慢慢懂

一、Clang

二、对象的本质

探索的对象本质的步骤

2.1创建项目

15998947394983.jpg

2.2在main.m添加代码

@interface Student : NSObject
@end
@implementation Student
@end

2.3生成main.cpp文件

在main的根目录下,点击go2Shell文件,输入clang -rewrite-objc main.m -o main.cpp,将main.m文件编译成cpp文件。

15998956650604.jpg

2.4查看main.cpp文件

15998959278254.jpg

编译成了结构体。

2.5添加属性,再探cpp文件
@property(nonatomic,strong)NSString *stuName;
@property(nonatomic,strong)NSString *stuSex;
15998978469498.jpg
结构体struct Student_IMPL
struct Student_IMPL {
    struct NSObject_IMPL NSObject_IVARS;
    NSString *_stuName;
    NSString *_stuSex;
};

set方法

get方法

底层代码中,Student被编译成了结构体存在,其属性成为结构体中变量存在,有set和get方法。对象的本质其实是结构体。

三、ISA的结构

源码文件https://github.com/zhaimengting/objc4
isa.h文件

# if __arm64__
#   define ISA_MASK        0x0000000ffffffff8ULL
#   define ISA_MAGIC_MASK  0x000003f000000001ULL
#   define ISA_MAGIC_VALUE 0x000001a000000001ULL
#   define ISA_BITFIELD                                                      \
      uintptr_t nonpointer        : 1;                                       \
      uintptr_t has_assoc         : 1;                                       \
      uintptr_t has_cxx_dtor      : 1;                                       \
      uintptr_t shiftcls          : 33; /*MACH_VM_MAX_ADDRESS 0x1000000000*/ \
      uintptr_t magic             : 6;                                       \
      uintptr_t weakly_referenced : 1;                                       \
      uintptr_t deallocating      : 1;                                       \
      uintptr_t has_sidetable_rc  : 1;                                       \
      uintptr_t extra_rc          : 19
#   define RC_ONE   (1ULL<<45)
#   define RC_HALF  (1ULL<<18)

上一篇 下一篇

猜你喜欢

热点阅读