前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS内存管理(一)-基本的概念

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

原创
作者头像
用户6658895
修改2023-07-20 18:25:28
4200
修改2023-07-20 18:25:28
举报

内存管理

体系
体系

内存布局

什么是引用计数

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

引用计数器的管理

引用计数的存储

SideTable

Side Table
Side Table
RefcountMap
RefcountMap
参考:isa结构图
参考:isa结构图

底层的实现

retainCount
release
RefCountMap的原理

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

Weak的原理

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

 weak结构科
weak结构科

Delloc的原理

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

关键字的实现原理

TaggedPointer

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

自动释放池

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 内存管理
  • 内存布局
  • 什么是引用计数
  • 引用计数器的管理
  • 引用计数的存储
  • SideTable
  • 底层的实现
    • retainCount
      • release
        • RefCountMap的原理
        • Weak的原理
        • Delloc的原理
        • 关键字的实现原理
        • TaggedPointer
        • 自动释放池
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档