OC 内存管理的基本概念
###1. 内存管理的基本概念
-
栈区 stack
-
堆区 heap
heap(堆)是最自由的一种内存,它完全由程序来负责内存的管理,包括什么时候申请,什么时候释放,而且对它的使用也没有什么大小的限制。在C/C++中,用alloc系统函数和new申请的内存都存在于heap段中。
-
BSS区
来存放没有被初始化或初始化为0的全局变量,因为是全局变量,所以在程序运行的整个生命周期内都存在于内存中。有趣的是这个段中的变量只占用程序运行时的内存空间,而不占用程序文件的储存空间。
-
数据区 Data
初始化过的全局变量数据段,该段用来保存初始化了的非0的全局变量,如果全局变量初始化为0,则编译有时会出于优化的考虑,将其放在bss段中。因为也是全局变量,所以在程序运行的整个生命周期内都存在于内存中。与bss段不同的是,data段中的变量既占程序运行时的内存空间,也占程序文件的储存空间。
-
代码区 text
2. OC内存管理的范围
堆区
中 继承 NSObject
的 对象
内存管理的原理及分类
-
引用计数
-
ARC
orMRC
MRC快速入门
-
+1
alloc new copy
-
-1
release autorelease
内存管理原则
-
原则
对象有人使用,不回收
使用对象,+1
不使用对象 -1
-
谁创建, 谁release
- 谁retain, 谁release
-
总结
+1 就该-1
内存管理的研究内容:
-
野指针
- 定义的指针没有初始化(没有指向)
- 指向的空间已经被释放 (僵尸对象)
-
内存泄漏
栈区指针变量已经被释放,而堆区的空间还没有被释放
单个对象的内存管理(野指针)
###僵尸对象 已经被释放的对象,在内存中可能还能继续访问,但容易出
开启僵尸对象检测:
避免使用僵尸对象
对象释放后,将 指针
-> nil
带个对象的内存泄漏
⚠️ 注意 相互持有 、自己调用自己 的情况
[self mothd:self];