美文网首页
iOS对象及其初始化分析

iOS对象及其初始化分析

作者: 粗暴不简单 | 来源:发表于2021-04-03 17:01 被阅读0次

对象和类

简单概括,理解‘一个模子刻出来的’这句话就基本理解了类和对象的关系。


类与对象

如上图:
对象-->类对象-->元类对象,本文暂不讨论元类,可以看到 对象的isa指向类对象。

typedef struct objc_class *Class;
typedef struct objc_object *id;

类对象本质上是一个objc_class的结构体,对象是一个objc_object的结构体,objc_object第一个成员就是isa。

isa是个什么鬼

isa是个isa_t的联合体,其定义经过删减拼凑大概如下(from objc-818):

union isa_t {
    uintptr_t bits;
    Class cls;
    struct {
#if arm64e
      uintptr_t nonpointer        : 1;                                       \
      uintptr_t has_assoc         : 1;                                       \
      uintptr_t weakly_referenced : 1;                                       \
      uintptr_t shiftcls_and_sig  : 52;                                      \
      uintptr_t has_sidetable_rc  : 1; 
      uintptr_t extra_rc          : 8;
#elif arm64
      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 unused            : 1;                                       \
      uintptr_t has_sidetable_rc  : 1;                                       \
      uintptr_t extra_rc          : 19;
#else
      ...
#endif
    };
};

-nonpointer:标识isa是不是个指针,值为1时非指针,也就是isa这时候对应isa_t中的结构体;值为0时,表示是个指针,对应Class,也就是指向objc_class类型的结构体。

下面分析下普通arm64下的

-has_assoc:标识位,具体用途暂时没看
-has_cxx_dtor:有无c++析构函数
-shiftcls:经处理后类对象的地址(处理回来能找到类对象)
-magic:具体用途暂时没看
-weakly_referenced:对象有没有被弱引用
-unused:没用不用管
-extra_rc:引用计数值
-has_sidetable_rc:当extra_rc溢出不够用了,需要采用sidetable时为true

对象的实例化流程

1.+ alloc

底层实现大概可总结为三步:

  • 计算需要的size
  • calloc开辟空间
  • 接下来initisa,将开辟的空间与类对象关联
2.- init

其实init方法啥也没干,比如initWithXXX等,一个作用可能就是给这种支撑吧

id
_objc_rootInit(id obj)
{
    // In practice, it will be hard to rely on this function.
    // Many classes do not properly chain -init calls.
    return obj;
}

相关文章

  • iOS对象及其初始化分析

    对象和类 简单概括,理解‘一个模子刻出来的’这句话就基本理解了类和对象的关系。 如上图:对象-->类对象-->元类...

  • iOS 录音方法

    iOS 录音功能 初始化AVAudioRecorder 对象 初始化一个AVAudioRecorder 对象 参数...

  • 232对象初始化器

    对象在创建时可以通过对象初始化器完成“属性的初始化”(.Net3.0及其后续版本中使用) 传统初始化方式 使用对象...

  • iOS 中 weak 的实现原理

    开头 本文是看了 iOS 底层解析weak的实现原理(包含weak对象的初始化,引用,释放的分析) 一文后,为了加...

  • 深入解构iOS系统下的全局对象和初始化函数

    深入解构iOS系统下的全局对象和初始化函数

  • iOS视图的生命周期

    iOS中视图的生命周期 alloc 创建对象,分配空间 init (initWithNibName)初始化对象,...

  • isa结构解析

    1. isa初始化 在 iOS alloc原理分析 中会 initInstanceIsa中初始化isa,源码如下:...

  • Mybatis系列之四 MappMethod(揭示Mapper类

    一、思路 分析MapperMethod的初始化过程,以及其下的成员变量。分析MapperMethod的命令的执行过...

  • iOS OC 对象的内存对齐原则

    iOS OC 对象的内存对齐原则 1.问题的引入 初始化一个OC类,具有如下属性: 初始化对象,并获取对象的内存s...

  • Java 对象初始化详细过程(转)

    一个类及其对象初始化的过程 一、什么时候需要初始化一个类 首次创建某个对象时: 首次访问某个类的静态方法或者静态字...

网友评论

      本文标题:iOS对象及其初始化分析

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