iOS-底层原理34-内存管理(下)和RunLoop

《iOS底层原理文章汇总》
上一篇文章iOS-底层原理33-内存管理(上)介绍了内存管理,本文接着介绍内存管理(下)和RunLoop

class AutoreleasePoolPage : private AutoreleasePoolPageData
1.指针->栈的结构
2.对象释放 + POOL_BOUNDARY 哨兵 -> 边界
3.页的结构+双向链表
4.线程有关系

1.AutoreleasePool

I.Clang编译底层源码@autoreleasepool{},相当于__AtAutoreleasePool __autoreleasepool;,{}表示作用域,__AtAutoreleasePool为结构体,由构造函数和析构函数组成

 struct __AtAutoreleasePool {
   __AtAutoreleasePool() {atautoreleasepoolobj = objc_autoreleasePoolPush();}
   ~__AtAutoreleasePool() {objc_autoreleasePoolPop(atautoreleasepoolobj);}
   void * atautoreleasepoolobj;
 };

iOS-底层原理34-内存管理(下)和RunLoop_第1张图片
image.png

II.自动释放池的结构,AutoreleasePoolPage::push(), class AutoreleasePoolPage : private AutoreleasePoolPageData,::相当于类调用类方法
iOS-底层原理34-内存管理(下)和RunLoop_第2张图片
image.png

iOS-底层原理34-内存管理(下)和RunLoop_第3张图片
image.png

iOS-底层原理34-内存管理(下)和RunLoop_第4张图片
image.png

III.自动释放池的结构分析
AutoreleasePoolPage继承于AutoreleasePoolPageData,初始化方法来自于AutoreleasePoolPageData
iOS-底层原理34-内存管理(下)和RunLoop_第5张图片
image.png

iOS-底层原理34-内存管理(下)和RunLoop_第6张图片
image.png

iOS-底层原理34-内存管理(下)和RunLoop_第7张图片
image.png

iOS-底层原理34-内存管理(下)和RunLoop_第8张图片
image.png

内存平移56个字节
iOS-底层原理34-内存管理(下)和RunLoop_第9张图片
image.png

iOS-底层原理34-内存管理(下)和RunLoop_第10张图片
image.png

iOS-底层原理34-内存管理(下)和RunLoop_第11张图片
image.png

iOS-底层原理34-内存管理(下)和RunLoop_第12张图片
image.png

IV.自动释放池释放原理,################ POOL 0x103009038 哨兵对象 边界 越界,3*16+8 = 56 AutoreleasePool自身的begin()位置,哨兵对象表示边界
iOS-底层原理34-内存管理(下)和RunLoop_第13张图片
image.png

若放504个对象正好一页,504个对象加上一个哨兵对象505个对象
iOS-底层原理34-内存管理(下)和RunLoop_第14张图片
image.png

若放505个对象,重新开始一页,指针地址从38开始,新的一页,每一页的大小为4096个字节=505*8=4040+自身大小56=4096


iOS-底层原理34-内存管理(下)和RunLoop_第15张图片
image.png

define I386_PGBYTES 4096

define PAGE_SIZE I386_PGBYTES

define PAGE_MIN_SIZE PAGE_SIZE

iOS-底层原理34-内存管理(下)和RunLoop_第16张图片
image.png

从第二页开始可以压入多少个对象?哨兵对象在一个自动释放池中存在几个?
iOS-底层原理34-内存管理(下)和RunLoop_第17张图片
image.png

V.对象是怎么压栈的,页是怎么关联的?
0.判断页面存不存在
1.push:压栈进来一个边界+当前页,变为hotPage,表示当前正在操作的页面,coldPage表示当前没有被操作的页面
2.判断页是否满了,没满,继续添加页面,满了新建页,设置为coldPage
child是子的一页,新的一页
iOS-底层原理34-内存管理(下)和RunLoop_第18张图片
image.png

iOS-底层原理34-内存管理(下)和RunLoop_第19张图片
image.png

VI.autorelease怎么加入自动释放池中
iOS-底层原理34-内存管理(下)和RunLoop_第20张图片
image.png

iOS-底层原理34-内存管理(下)和RunLoop_第21张图片
image.png

iOS-底层原理34-内存管理(下)和RunLoop_第22张图片
image.png

VII.对象在自动释放池中的出栈,出栈会调用 atautoreleasepoolobj = objc_autoreleasePoolPush();objc_autoreleasePoolPop(atautoreleasepoolobj);,压栈找child,出栈找parent
iOS-底层原理34-内存管理(下)和RunLoop_第23张图片
image.png

iOS-底层原理34-内存管理(下)和RunLoop_第24张图片
image.png

iOS-底层原理34-内存管理(下)和RunLoop_第25张图片
image.png

releaseUntil
iOS-底层原理34-内存管理(下)和RunLoop_第26张图片
image.png

kill
iOS-底层原理34-内存管理(下)和RunLoop_第27张图片
image.png

从子节点到父节点,不断的出栈,kill掉初始化数据,往父节点平移
iOS-底层原理34-内存管理(下)和RunLoop_第28张图片
image.png

2.Runloop

I.保持程序的持续运行
II.处理APP中的各种事件(触摸、定时器、performSelector)
III.节省cpu资源、提供程序的性能:该做事就做事,该休息就休息

image.png

runloop是一个do while循环,和普通的循环有区别,循环会持续占用cpu,runloop不会持续占用cpu
image.png

runloop中的item
iOS-底层原理34-内存管理(下)和RunLoop_第29张图片
image.png

timer类型响应runloop
iOS-底层原理34-内存管理(下)和RunLoop_第30张图片
image.png

IV.runloop是什么
通过主运行循环查询源码 CFRunLoopRef mainRunloop = CFRunLoopGetMain()
iOS-底层原理34-内存管理(下)和RunLoop_第31张图片
image.png

iOS-底层原理34-内存管理(下)和RunLoop_第32张图片
image.png

线程和runloop绑定是怎么创建的呢?runloop是一个对象,有多个属性
iOS-底层原理34-内存管理(下)和RunLoop_第33张图片
image.png

iOS-底层原理34-内存管理(下)和RunLoop_第34张图片
image.png

V.runloop和线程的关系
iOS-底层原理34-内存管理(下)和RunLoop_第35张图片
image.png

VI.runloop的事务处理原理:子线程的runloop默认不启动
iOS-底层原理34-内存管理(下)和RunLoop_第36张图片
image.png

子线程的runloop不run,子线程中的timer不会执行,timer要加到对应模型的runloop中才能执行,timer是如何加到runloop中的呢?
iOS-底层原理34-内存管理(下)和RunLoop_第37张图片
image.png

存在多种类型的事务,timer,observer,source,main_dispatch_queue,block(),timer中的内容是如何回调的?
runloop中add(timer)会调用,什么时候执行呢?在调用runloop run的时候
iOS-底层原理34-内存管理(下)和RunLoop_第38张图片
image.png

__CFRunLoopDoTimers(rl, rlm, mach_absolute_time())->__CFRunLoopDoTimer(rl, rlm, rlt)
iOS-底层原理34-内存管理(下)和RunLoop_第39张图片
image.png

iOS-底层原理34-内存管理(下)和RunLoop_第40张图片
image.png

timer的执行分为四步
A.timer依赖的mode加入runloop
B.runloop run -> do timers 的时候把所有的timers执行
C.执行单个的timer, do timer
D.执行回调函数
同理,source和observer是一样的道理
iOS-底层原理34-内存管理(下)和RunLoop_第41张图片
image.png

iOS-底层原理34-内存管理(下)和RunLoop_第42张图片
image.png

VII.runloop底层原理
iOS-底层原理34-内存管理(下)和RunLoop_第43张图片
image.png

iOS-底层原理34-内存管理(下)和RunLoop_第44张图片
image.png

image.png

iOS-底层原理34-内存管理(下)和RunLoop_第45张图片
image.png

iOS-底层原理34-内存管理(下)和RunLoop_第46张图片
image.png

iOS-底层原理34-内存管理(下)和RunLoop_第47张图片
image.png

RunLoop在kCFRunLoopBeforeWaiting和kCFRunLoopAfterWaiting两个状态间进行切换

你可能感兴趣的:(iOS-底层原理34-内存管理(下)和RunLoop)