谈谈iOS中的内存管理 | 青训营笔记

59 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第2天

内存存储

  • 存储参数/局部变量/函数调用后返回的地址,是线程安全的
  • 系统自动分配内存,存储速度较快
  • 由高地址向低地址扩展
  • 栈顶指针指向栈顶元素,遵循先进后出的原则

  • 与Heap数据结构无关
  • 手动分配内存
  • 存储数组和对象,线程共享
  • 由低地址向高地址扩展

iOS中的内存管理

在OC中,使用引用技术来进行内存管理,每个对象都有一个对应的引用计数

  • 使用"alloc",“new”,"copy","mutableCopy"等开头创建的对象,引用计数 = 1
  • retain使引用计数+1
  • release使引用计数-1
  • 当对象的引用计数=0时即将销毁对象,系统会向对象发送dealloc

ARC

ARC内存管理机制在编译器自动计入内存管理代码

  1. 只需要创建对象即可,不需要手动维护引用计数
  2. 只要有一个强指针指向对象,对象就不能释放
  3. 默认所有对象的指针都是强指针,如需要使用弱指针需要显式地声明,如__weak

Property修饰符

  1. Strong强引用,强持有对象,引用计数+1
  2. weak弱引用,引用计数不会+1
  3. copy拷贝,分为深拷贝和浅拷贝。深拷贝:会创建新的内存区域去存储,并将指针指向这个新的内存区域;浅拷贝:不会创建新的内存区域,复制一个新的指针,指向同一块内存区域。 注意:
  • 不可变对象copy->浅拷贝
  • 不可变对象mutableCopy->深拷贝
  • 可变对象copy->深拷贝
  • 可变对象mutableCopy->深拷贝
  1. assign指定setter使用简单赋值,一般用于int,double,float,NSInteger,CGRect等一般数据类型,不能对OC对象使用

内存导致的崩溃

野指针

对象被提前释放或者回收了,但是指向该对象的指针没有做任何的修改,导致指针指向一块已经被回收的内存地址

OOM

因内存占用过高而被操作系统强行终止