这是我参与「第四届青训营 」笔记创作活动的的第2天
内存存储
栈
- 存储参数/局部变量/函数调用后返回的地址,是线程安全的
- 系统自动分配内存,存储速度较快
- 由高地址向低地址扩展
- 栈顶指针指向栈顶元素,遵循先进后出的原则
堆
- 与Heap数据结构无关
- 手动分配内存
- 存储数组和对象,线程共享
- 由低地址向高地址扩展
iOS中的内存管理
在OC中,使用引用技术来进行内存管理,每个对象都有一个对应的引用计数
- 使用"alloc",“new”,"copy","mutableCopy"等开头创建的对象,引用计数 = 1
- retain使引用计数+1
- release使引用计数-1
- 当对象的引用计数=0时即将销毁对象,系统会向对象发送dealloc
ARC
ARC内存管理机制在编译器自动计入内存管理代码
- 只需要创建对象即可,不需要手动维护引用计数
- 只要有一个强指针指向对象,对象就不能释放
- 默认所有对象的指针都是强指针,如需要使用弱指针需要显式地声明,如__weak
Property修饰符
- Strong强引用,强持有对象,引用计数+1
- weak弱引用,引用计数不会+1
- copy拷贝,分为深拷贝和浅拷贝。深拷贝:会创建新的内存区域去存储,并将指针指向这个新的内存区域;浅拷贝:不会创建新的内存区域,复制一个新的指针,指向同一块内存区域。 注意:
- 不可变对象copy->浅拷贝
- 不可变对象mutableCopy->深拷贝
- 可变对象copy->深拷贝
- 可变对象mutableCopy->深拷贝
- assign指定setter使用简单赋值,一般用于int,double,float,NSInteger,CGRect等一般数据类型,不能对OC对象使用
内存导致的崩溃
野指针
对象被提前释放或者回收了,但是指向该对象的指针没有做任何的修改,导致指针指向一块已经被回收的内存地址
OOM
因内存占用过高而被操作系统强行终止