内存管理
内存布局
什么是引用计数
- Objective-C通过retainCount的机制来决定对象是否需要释放。 每次runloop迭代结束后,都会检查对象的retainCount,如果retainCount等于0,就说明该对象没有地方需要继续使用它,可以被释放掉了。无论是手动管理内存,还是ARC机制,都是通过对retainCount来进行内存管理的。
- 内存中每一个对象都有一个属于自己的引用计数器。当某个对象A被另一个家伙引用时,A的引用计数器就 1,如果再有一个家伙引用到A,那么A的引用计数器就再 1。当其中某个家伙不再引用A了,A的引用计数器会-1。直到A的引用计数减到了0,那么就没有人再需要它了,就是时候把它释放掉了。
引用计数器的管理
引用计数的存储
SideTable
底层的实现
retainCount
release
RefCountMap的原理
- 通过计算对象地址的哈希值, 来从SideTables中获取对应的SideTable. 哈希值重复的对象的引用计数存储在同一个SideTable里.
- SideTable 使用find() 方法和重载 [] 运算符的方式, 通过对象地址来确定对象对应的桶. 最终执行到的查找算法是LookupBucketFor().
Weak的原理
weak引用表会用对象的地址作为key,所有指向指向对象指针的地址作为value数组
Delloc的原理
- 接下来调用rootDealloc()
- 判断五个条件
- object_dispose
- clearDeallocating
- Dealloc的执行流程结束
关键字的实现原理
TaggedPointer
支持的目标类型
- NSString
- NSNumber
- NSDate
- NSIndexPath
如果存储的数量小,用这种类型,过大则使用对应的对象类型。
自动释放池
AutoreleasePool:自动释放池是 Objective-C 开发中的一种自动内存回收管理的机制,为了替代开发人员手动管理内存,实质上是使用编译器在适当的位置插入release、autorelease等内存释放操作。当对象调用 autorelease 方法后会被放到自动释放池中延迟释放时机,当缓存池需要清除dealloc时,会向这些 Autoreleased 对象做 release 释放操作。