iOS 内存管理

48 阅读1分钟

u=320059842,1332365365&fm=253&fmt=auto&app=138&f=JPEG.webp

本文主要梳理iOS 内存管理 核心知识

  1. 内存布局
  2. 内存管理方案
  3. 数据结构
  4. ARC&MRC
  5. 引用计数
  6. 弱引用
  7. 自动释放池
  8. 循环引用

1.内存布局

image.png

2.内存管理方案

1.TaggedPointer

32位系统 Tagged Pointer 对象一般用于 NSNumberNSDateNSString 等小对象的存储。通常来说,普通对象对象需要动态分配内存、维护引用计数等,对象指针存储的是堆中的对象的地址值。而 Tagged Pointer 对象呢,其指针里面不是地址,而是它的值。所以 Tagged Pointer 实际上已经不能算是对象了,只是一个对象皮的普通变量。它的内存并不存在堆中,也不需要 mallocfree。Tagged Pointer 对象不仅节省内存,在内存读取和对象创建上效率大大提高。

image.png

64位用NONPOINTER_ISA

2.NONPOINTER_ISA

isa 部分值代表class地址

draveness.me/isa/

3.散列表

是以sidetable()结构存在的

由自旋锁,弱引用表和引用计数表组成

extra_rc 来储存引用计数,当引用计数不够的时候一部分会保存到 sidetable 中。

3.数据结构

image.png

4.ARC&MRC

image.png

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()

image.png

6.弱引用

添加weak变量 通过hash算法添加位置

objc_initweak()->storeWeak()->weak_register_no_lock()

清除weak变量,同时设置指向nil

dealloc()->weak_clear_no_lock()

image.png

7.自动释放池

image.png

8.循环引用

image.png