iOS 内存管理

iOS 设备的内存是极其有限的,直接影响用户体验。
Session 242 iOS App Performance Memory

内存相关

  1. 堆栈:已知数据类型会被分配在栈上,栈上的内存不需要自己管理,栈是每个线程独享的一种数据结构,未知大小的类型需要向堆申请控件,堆的内存需要自己管理
  2. 比如:Person *p=[[Person alloc] init]; ,alloc是分配内存空间,init 是做初始化,*p存放堆空间返回的地址
  3. ARC实际上一个语法糖,编译器在合适的位置为你添加MRC的代码,只要出现了new,alloc,retain,就一定要出现一个release,autorelease
  4. 内存分类:Clean Memory,Dirty Memory
  5. 物理内存和虚拟内存
  6. 虚拟内存映射到物理内存会存在一个寻址的过程,界限寄存器判断物理内存地址是否越界,如果没有,就加上基址
  7. 桌面使用Swap机制,将不用的进程置换到磁盘
  8. iOS 使用优先级队列的机制,从闲置到后台再到前台,如果内存还是不足,就杀掉进程

属性

  1. atomic:线程安全
  2. nonatomic:非线程安全
  3. strong: 强引用对象
  4. weak: 弱引用对象
  5. assign: 基本数据类型,可以修饰非OC对象
  6. copy: NSString,NSArray,NSDictionary等

copy mutableCopy

  1. 集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制 可变对象都是内容复制,不可变对象copy是指针,mutableCopy是内容复制

Retain Cycle

  1. strongweak dance
  2. __weak打破self环
  3. __strong确保对象不释放

NSAutoReleasePool

  1. 将线程中要执行的任务都放在自动释放池中,自动释放池会捕获所有任务中的对象,在任务结束或线程关闭之时自动释放这些对象
  2. 每个主Runloop结束时进行drain操作,自动释放池收到 drain消息时将这些对象的引用计数减一,然后将它们从池子中移除 。

AutoReleasePool

  1. 避免内存峰值,循环一次释放一次,一次性归还很多,每次归还一点点

你可能感兴趣的:(iOS 内存管理)