学习MJ的视频课程,整理总结知识点–weak指针、autorelease原理
引用计数的存储
存储位置
对象释放
weak指针的原理
weak引用是存储在哈希表(弱引用表SideTable->weak_table),当对象dealloc时,dealloc方法会清除哈希表中对应的值
关联对象表、引用计数表
ARC帮我们做了什么
LLVM+Runtime相互协作的结果
利用LLVM自动帮我们生成release、retain、autorelease等内存管理相关的代码,弱引用的清除利用了Runtime运行时自动处理。
autorelease原理
clang源代码,发现__AtAutoreleasePool的两个关键的函数
runtime中查看这两个函数的实现,发现调用的是AutoreleasePoolPage类的方法
调用了autorelease的对象最终都是通过AutoreleasePoolPage对象来管理的
研究AutoreleasePoolPage的结构
多个pool,之间是通过双向链表联系
知道每个pool内空间的分布
调用push方法会将一个POOL_BOUNDARY
入栈(插入边界标记),并且返回其存放的内存地址
调用pop方法时传入一个POOL_BOUNDARY
的内存地址,会从最后一个入栈的对象开始发送release消息,直到遇到这个POOL_BOUNDARY
id *next指向了下一个能存放autorelease对象地址的区域
查看的函数_objc_autoreleasePoolPrint();
push流程,压边界标记,添加autorelease对象到page里
pop流程,查找直到边界标记token,release
autorelease总结
对象存储在AutoreleasePoolPage,每个自动释放池插入自动释放对象前先插入POOL_BOUNDARY
作为边界标记
RunLoop与autorelease
autorelease对象在什么时候会被释放
1、被autoreleasepool包围的,出了括号就被释放
2、在iOS项目中测试,并不是被main函数的autoreleasepool管理的,因为main函数里的autoreleasepool包围着主线程的RunLoop,是一直走不到autoreleasepool大括号结尾的
1 | - (void)viewDidLoad { |
1 | /* |
总结
参考和源码
源码: