马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1. 根本数据布局
- // 对象结构
- struct objc_object {
- isa_t isa; // isa 指针,包含引用计数信息
- };
- // isa 的位域结构
- union isa_t {
- uintptr_t bits;
- struct {
- uintptr_t nonpointer : 1; // 是否启用优化的 isa 指针
- uintptr_t has_assoc : 1; // 是否有关联对象
- uintptr_t has_cxx_dtor : 1; // 是否有 C++ 析构函数
- uintptr_t shiftcls : 33; // 类的指针
- uintptr_t magic : 6; // 用于调试
- uintptr_t weakly_referenced : 1; // 是否有弱引用
- uintptr_t deallocating : 1; // 是否正在释放
- uintptr_t has_sidetable_rc : 1; // 引用计数是否在 SideTable 中
- uintptr_t extra_rc : 19; // 额外的引用计数值
- };
- }
复制代码 2. 引用计数存储位置
2.1 isa 优化
- inline bool
- objc_object::hasNonpointerIsa() {
- return isa.nonpointer; // 判断是否使用优化的 isa
- }
- // 引用计数存储在 isa 的情况
- if (isa.nonpointer) {
- // 引用计数存储在 isa.extra_rc 中
- // 最多可存储 2^19 - 1 个引用
- }
复制代码 2.2 SideTable 存储
- struct SideTable {
- spinlock_t slock;
- RefcountMap refcnts; // 引用计数哈希表
- weak_table_t weak_table; // 弱引用表
- };
- // 当 isa 中的引用计数溢出时
- if (isa.has_sidetable_rc) {
- // 引用计数存储在 SideTable 的 refcnts 中
- }
复制代码 3. 引用计数操纵
3.1 retain 操纵
- id objc_retain(id obj) {
- if (!obj) return obj;
- if (obj->isTaggedPointer()) return obj;
- return obj->retain();
- }
- inline id
- objc_object::retain() {
- if (isTaggedPointer()) return this;
-
- if (fastpath(!ISA()->hasCustomRR())) {
- if (fastpath(isa.hasNonpointerIsa())) {
- addExtraRC_nolock();
- } else {
- sidetable_retain();
- }
- }
- return this;
- }
复制代码 3.2 release 操纵
- void objc_release(id obj) {
- if (!obj) return;
- if (obj->isTaggedPointer()) return;
- obj->release();
- }
- inline bool
- objc_object::release() {
- if (isTaggedPointer()) return false;
-
- if (fastpath(!ISA()->hasCustomRR())) {
- if (fastpath(isa.hasNonpointerIsa())) {
- return sidetable_release(true);
- }
- return sidetable_release(false);
- }
- return false;
- }
复制代码 4. 引用计数溢出处理
- void objc_object::sidetable_addExtraRC_nolock(size_t delta_rc) {
- // 当 isa.extra_rc 即将溢出时
- if (isa.extra_rc + delta_rc > RC_MASK) {
- // 将引用计数迁移到 SideTable
- isa.has_sidetable_rc = true;
- auto &table = SideTables()[this];
- size_t& refcnt = table.refcnts[this];
- refcnt += delta_rc;
- } else {
- // 继续使用 isa 存储
- isa.extra_rc += delta_rc;
- }
- }
复制代码 5. 弱引用处理
5.1 弱引用表布局
- struct weak_table_t {
- weak_entry_t *weak_entries; // 弱引用数组
- size_t num_entries; // 条目数
- uintptr_t mask; // 容量掩码
- uintptr_t max_hash_displacement; // 最大哈希偏移
- };
复制代码 5.2 弱引用操纵
- id objc_loadWeakRetained(id *location) {
- id obj = *location;
- if (!obj) return nil;
- if (obj->isTaggedPointer()) return obj;
- return obj->rootRetain();
- }
- void objc_storeWeak(id *location, id obj) {
- _objc_weak_store(location, obj);
- }
复制代码 6. 自动释放池相干
- void *objc_autoreleasePoolPush(void) {
- return AutoreleasePoolPage::push();
- }
- void objc_autoreleasePoolPop(void *ctxt) {
- AutoreleasePoolPage::pop(ctxt);
- }
- id objc_autorelease(id obj) {
- if (!obj) return obj;
- if (obj->isTaggedPointer()) return obj;
- return obj->autorelease();
- }
复制代码 7. 优化机制
7.1 Tagged Pointer
- bool isTaggedPointer() {
- return ((uintptr_t)this & _OBJC_TAG_MASK) == _OBJC_TAG_MASK;
- }
- // Tagged Pointer 对象不参与引用计数
- if (obj->isTaggedPointer()) {
- return obj; // 直接返回,不进行引用计数操作
- }
复制代码 7.2 散列表优化
- // SideTable 的哈希表实现
- struct RefcountMap : public objc::DenseMap<DisguisedPtr<objc_object>,size_t,true> {
- // 使用 DenseMap 提高查找效率
- };
复制代码 8. 内存管理计谋
8.1 dealloc 流程
- inline void
- objc_object::rootDealloc() {
- if (isTaggedPointer()) return;
-
- if (fastpath(isa.hasNonpointerIsa())) {
- // 快速释放路径
- if (fastpath(!isa.weakly_referenced && !isa.has_assoc)) {
- free(this);
- return;
- }
- }
- object_dispose((id)this);
- }
复制代码 8.2 引用计数检查
- bool objc_object::rootTryRetain() {
- if (isTaggedPointer()) return true;
-
- if (fastpath(!ISA()->hasCustomRR())) {
- if (fastpath(isa.hasNonpointerIsa())) {
- // 尝试增加引用计数
- return sidetable_tryRetain();
- }
- }
- return false;
- }
复制代码 这个引用计数体系的设计考虑了:
- 性能优化(isa 优化、Tagged Pointer)
- 内存效率(分散存储计谋)
- 线程安全(自旋锁、原子操纵)
- 扩展性(支持自界说引用计数)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |