iOS 设备的内存是极其有限的,直接影响用户体验。
Session 242 iOS App Performance Memory
内存相关
- 堆栈:已知数据类型会被分配在栈上,栈上的内存不需要自己管理,栈是每个线程独享的一种数据结构,未知大小的类型需要向堆申请控件,堆的内存需要自己管理
- 比如:
Person *p=[[Person alloc] init];
,alloc
是分配内存空间,init
是做初始化,*p
存放堆空间返回的地址 - ARC实际上一个语法糖,编译器在合适的位置为你添加MRC的代码,只要出现了
new,alloc,retain
,就一定要出现一个release,autorelease
- 内存分类:Clean Memory,Dirty Memory
- 物理内存和虚拟内存
- 虚拟内存映射到物理内存会存在一个寻址的过程,界限寄存器判断物理内存地址是否越界,如果没有,就加上基址
- 桌面使用Swap机制,将不用的进程置换到磁盘
- iOS 使用优先级队列的机制,从闲置到后台再到前台,如果内存还是不足,就杀掉进程
属性
- atomic:线程安全
- nonatomic:非线程安全
- strong: 强引用对象
- weak: 弱引用对象
- assign: 基本数据类型,可以修饰非OC对象
- copy: NSString,NSArray,NSDictionary等
copy mutableCopy
- 集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制 可变对象都是内容复制,不可变对象copy是指针,mutableCopy是内容复制
Retain Cycle
- strongweak dance
- __weak打破self环
- __strong确保对象不释放
NSAutoReleasePool
- 将线程中要执行的任务都放在自动释放池中,自动释放池会捕获所有任务中的对象,在任务结束或线程关闭之时自动释放这些对象
- 每个主Runloop结束时进行drain操作,自动释放池收到 drain消息时将这些对象的引用计数减一,然后将它们从池子中移除 。
AutoReleasePool
- 避免内存峰值,循环一次释放一次,一次性归还很多,每次归还一点点