ios - 内存管理机制
2020-10-01 本文已影响0人
Fat_Blog
内存管理
- 当我们创建对象,变量,调用方法时,程序都会给它们分配一定的内存
- 而栈(stack)里一般存放的是值变量(如int,double,enum等等),栈里面的内存是由系统管理的,也就是说内存是由系统自动分配释放的,栈采取的是先进后出的原则来进去插入删除操作
- 而堆(Heap)上一般存放的是OC对象,这部分需要程序员自己分配,自己释放,堆采取的是优先级高低来进行插入删除的,比如释放内存时一般从优先级高的开始释放
- 程序员需要去管理堆空间的内存,不然程序的内存过大时,程序会出现崩溃,闪退等现象,极其影响用户的体验
内存管理模式
- 手工引用计数和自动释放池(MRC)
- 自动引用计数(ARC)
MRC模式下的内存管理
引用计数器
- 每个对象被创建时都会有自己的引用计数器,当引用计数器为0时,对象会被系统回收
- 引用计数器可以理解为“当前有多少人正在引用当前对象“
- p对象被创建时,引用计数器默认为1,调用[p retain]时计数器加一,调用[p release],计数器减一
- 对象的引用计数为0时,系统会释放当前对象,同时会调用dealloc方法,在MRC模式下 ,如果重写dealloc方法,要带上[seper dealloc],在ARC模式下则不需要
自动释放池
- 当把对象扔进自动释放池里,就不用再去管对象的引用计数器,释放池可以统一释放掉池里的对象
//创建自动释放池
NSAutoreleasePool *autoreleasePool = [[NSAutoreleasePool alloc] init];
将对象p加入到自动释放池中
Person *p = [[[Person alloc] init] autorelease];
//销毁自动释放池
[autoreleasePool drain];
ARC模式
- ARC模式下不需要理会对象的引用计数器,它是根据对象有没有被强指针引用来决定是否会被系统自动销毁
- 在ARC模式下,如果要重写dealloc方法,不需要在方法里面加入[super dealloc]