iOS内存管理(一)-基本的概念

2023-07-20 18:25:28 浏览数 (1)

内存管理

体系体系

内存布局

什么是引用计数

  • Objective-C通过retainCount的机制来决定对象是否需要释放。 每次runloop迭代结束后,都会检查对象的retainCount,如果retainCount等于0,就说明该对象没有地方需要继续使用它,可以被释放掉了。无论是手动管理内存,还是ARC机制,都是通过对retainCount来进行内存管理的。
  • 内存中每一个对象都有一个属于自己的引用计数器。当某个对象A被另一个家伙引用时,A的引用计数器就 1,如果再有一个家伙引用到A,那么A的引用计数器就再 1。当其中某个家伙不再引用A了,A的引用计数器会-1。直到A的引用计数减到了0,那么就没有人再需要它了,就是时候把它释放掉了。

引用计数器的管理

引用计数的存储

SideTable

Side TableSide Table
RefcountMapRefcountMap
参考:isa结构图参考:isa结构图

底层的实现

retainCount
release
RefCountMap的原理

  • 通过计算对象地址的哈希值, 来从SideTables中获取对应的SideTable. 哈希值重复的对象的引用计数存储在同一个SideTable里.
  • SideTable 使用find() 方法和重载 [] 运算符的方式, 通过对象地址来确定对象对应的桶. 最终执行到的查找算法是LookupBucketFor().

Weak的原理

weak引用表会用对象的地址作为key,所有指向指向对象指针的地址作为value数组

 weak结构科 weak结构科

Delloc的原理

  • 接下来调用rootDealloc()
  • 判断五个条件
  • object_dispose
  • clearDeallocating
  • Dealloc的执行流程结束

关键字的实现原理

TaggedPointer

TaggedPointerTaggedPointer
支持的目标类型
  • NSString
  • NSNumber
  • NSDate
  • NSIndexPath
如果存储的数量小,用这种类型,过大则使用对应的对象类型。

自动释放池

AutoreleasePool:自动释放池是 Objective-C 开发中的一种自动内存回收管理的机制,为了替代开发人员手动管理内存,实质上是使用编译器在适当的位置插入release、autorelease等内存释放操作。当对象调用 autorelease 方法后会被放到自动释放池中延迟释放时机,当缓存池需要清除dealloc时,会向这些 Autoreleased 对象做 release 释放操作。

0 人点赞