本文主要梳理iOS 内存管理 核心知识
- 内存布局
- 内存管理方案
- 数据结构
- ARC&MRC
- 引用计数
- 弱引用
- 自动释放池
- 循环引用
1.内存布局
2.内存管理方案
1.TaggedPointer
32位系统 Tagged Pointer 对象一般用于 NSNumber
、NSDate
、NSString
等小对象的存储。通常来说,普通对象对象需要动态分配内存、维护引用计数等,对象指针存储的是堆中的对象的地址值。而 Tagged Pointer 对象呢,其指针里面不是地址,而是它的值。所以 Tagged Pointer 实际上已经不能算是对象了,只是一个对象皮的普通变量。它的内存并不存在堆中,也不需要 malloc
和 free
。Tagged Pointer 对象不仅节省内存,在内存读取和对象创建上效率大大提高。
64位用NONPOINTER_ISA
2.NONPOINTER_ISA
isa 部分值代表class地址
3.散列表
是以sidetable()结构存在的
由自旋锁,弱引用表和引用计数表组成
extra_rc 来储存引用计数,当引用计数不够的时候一部分会保存到 sidetable 中。
3.数据结构
4.ARC&MRC
5.引用计数
delloc实现
objc_rootDealloc->rootDealloc
-> 判断五个条件如果都没有直接free(nonpoint_isa,has_cxx_dtor,has_accoc,has_sidetable_rc,weakly_refercenced)
-> 否则 object_dispose->objc_destructInstance->
free->
实现 hasCxxDtor object_cxxDestruct(), hasAssociatedObjects _object_remove_assocations(),
clearDeallocating ()
实现 sidetable_clear_deallocating(),weak_clear_no_lock(),table.refcnts.earse()
6.弱引用
添加weak变量 通过hash算法添加位置
objc_initweak()->storeWeak()->weak_register_no_lock()
清除weak变量,同时设置指向nil
dealloc()->weak_clear_no_lock()