_objc_init 初始化操作

_objc_init⾥⾯的初始化操作。

1. environ_init():环境变量的初始化

2. tls_init:创建线程的析构函数

3. static_init:运⾏C++静态构造函数

4. runtime_init:分类表初始化,类表初始化

5. cache_t::init():缓存的初始化

6. _imp_implementationWithBlock_init:关于macOS的相关操作。

7. didCallDyldNotifyRegister:标识对_dyld_objc_notify_register的调⽤已完成。

load_images

作⽤:执⾏类和分类的 load ⽅法。

load⽅法总结

1.当⽗类和⼦类都实现load函数时,⽗类的load⽅法执⾏顺序要优先于⼦类

2.当⼀个类未实现load⽅法时,不会调⽤⽗类load⽅法

3.类中的load⽅法执⾏顺序要优先于分类(Category)

4.load⽅法使⽤了锁,所以是线程安全的。

5.当有多个类别(Category)都实现了load⽅法,这⼏个load⽅法都会执⾏,但执⾏顺序不确定(其执⾏

顺序与类别在Compile Sources中出现的顺序⼀致)

6.当然当有多个不同的类的时候,每个类load 执⾏顺序与其在Compile Sources出现的顺序⼀致

map_images

作⽤:进⾏类的初始化。

关键函数 read_images 流程

1: 加载所有类到类的gdb_objc_realized_classes表中。

2: 对所有类做重映射。

3: 将所有SEL都注册到namedSelectors表中。

4: 修复函数指针遗留。5: 将所有Protocol都添加到protocol_map表中。

6: 对所有Protocol做重映射。

7: 初始化所有⾮懒加载的类,进⾏rw、ro等操作。

8:遍历已标记的懒加载的类,并做初始化操作。

9:处理所有Category,包括Class和Meta Class。

10:初始化所有未初始化的类。

⾮懒加载类的初始化

关键函数: realizeClassWithoutSwift

关键代码:

//给rw开辟内存空间,然后将ro的数据“拷⻉”到rw⾥⾯。

rw = objc::zalloc<class_rw_t>();

rw->set_ro(ro);

rw->flags = RW_REALIZED|RW_REALIZING|isMeta;

cls->setData(rw);

//递归调⽤realizeClassWithoutSwift,对⽗类和元类进⾏初始化

supercls = realizeClassWithoutSwift(remapClass(cls->getSuperclass()), nil);

metacls = realizeClassWithoutSwift(remapClass(cls->ISA()), nil);

//设置⽗类,isa指针的初始化

cls->setSuperclass(supercls);

cls->initClassIsa(metacls);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值