内存管理
目录:
1内存布局
2内存管理方案
2.1Tagged Pointer
2.2NONPOINTER_ISA
2.3散列表(side table )
3数据结构
3.1自旋锁
3.2引用计数表
3.3弱引用表
4引用计数
5ARC & MRC
5.1MRC手动
5.2ARC自动
5.3iOS内存的代码实现
5.31alloc
5.32retain
5.33release
5.34retainCount
5.35autorelease
5.36dealloc
6弱引用
7自动释放池
8常见的容易造成泄漏的点
8.1循环引用
8.2使用单例的的一些情况
8.3NSTimer
8.4NSURLSession
8.5非OC对象的内存问题
8.6其他泄漏情况
8.7ARC内存泄露的检测
8.71使用Xcode自带工具Instrument
8.72在对象dealloc中进行打印
01.png
01内存布局
02.png03.png
堆栈空间分配
栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
堆栈缓存方式
栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。 堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
内存中的栈区处于相对较高的地址以地址的增长方向为上的话,栈地址是向下增长的
。
栈中分配局部变量空间,堆区是向上增长的用于分配程序员申请的内存空间。另外还有静态区是分配静态变量,全局变量空间的;只读区是分配常量和程序代码空间的;以及其他一些分区。
2内存管理方案
03.png2.1Tagged Pointer
Tagged Pointer01.pngTagged Pointer02.png
Tagged Pointer03.png
2.2NONPOINTER_ISA(非指针型isa)
NONPOINTER_ISA01.pngNONPOINTER_ISA02.png
2.3散列表(side table )
散列表01.png散列表02.png 散列表03.png 散列表04.png 散列表05.png 散列表06.png
3数据结构
3.1自旋锁
自旋锁.png3.2引用计数表
引用计数表.png3.3弱引用表
弱引用表.png4 引用计数
5ARC & MRC
5.1 MRC(MannulReference Counting)
需要程序员自己管理一个对象的引用计数。
MRC.png
5.2 ARC(Automatic Reference Counting)
ARC 是苹果引入的一种自动内存管理机制,会根据引用计数自动监视对象的生存周期,实现方式是在编译时期自动在已有代码中插入合适的内存管理代码以及在 Runtime 做一些优化。
ARC.png5.3 iOS内存的代码实现
5.31alloc
5.32retain
5.33release
5.34retainCount
5.35autorelease
5.36dealloc
6 弱引用
7 autoreleasepool 自动释放池
8常见的容易造成泄漏的点
8.1循环引用
8.2使用单例的的一些情况
8.3NSTimer
8.4NSURLSession
8.5非OC对象的内存问题
8.6其他泄漏情况
8.7ARC内存泄露的检测
8.71使用Xcode自带工具Instrument
8.72在对象dealloc中进行打印
参考文章:
http://blog.devtang.com/2016/07/30/ios-memory-management/
https://juejin.im/post/5abe543bf265da23784064dd
https://www.jianshu.com/p/5d2163640e26
https://juejin.im/post/5c4821fdf265da613b70159d
https://juejin.im/post/5c0744f6e51d45598b76f481
https://juejin.im/post/58c9fff8128fe1006c7be387
https://juejin.im/post/5ce36300f265da1b8b2b32b6?utm_source=gold_browser_extension#heading-14