说起内存管理,看似老生常谈,但是真正掌握内存管理并不简单。小伙伴们要加油了。
Objective-C的内存管理机制与Java那种全自动的垃圾回收机制是不同的,它本质上还是C语言中的手动管理方式,通过引用计数机制管理内存。其内存管理方法分为MRC和ARC:
- MRC:手动管理内存,早期代码都是使用这个方式。
- ARC:自动管理内存,iOS5之后苹果提供的一种自动管理内存的方式,较好的提升了开发效率(本质还是基于MRC的)。
引用计数:所谓引用计数,即在对象内部保存一个数字(retain count),表示该对象呗引用的次数,当计数为0时系统会释放内存中的对象。
那么哪些操作能够引起计数 +1 或者 -1呢?
- 引用计数 +1:
- alloc:创建对象时调用此方法,为对象开辟内存空间,对象引用计数 +1。
- copy:拷贝一个对象,返回新对象,被拷贝区域引用计数不变,新的内存区域引用计数为1。
- retain:获得对象的所有权,引用计数 +1。
- 引用计数 -1:
- release:释放对象的所有权,引用计数 -1,计数为0时对象被释放。
- autorelease:自动释放(在未来的某个时机释放)。
- dealloc:在对象的引用计数为0的时候调用,销毁所开辟的内存空间,有开辟就要有销毁。
注意 !
- autorelease是一个特别的方法,实际上是把release消息交给一个叫做自动释放池(autorelease pool)的东西延迟执行,即在系统觉得需要清理的时候,才会调用release方法。
- copy拷⻉,一般用于 NSString. 分为深拷贝和浅拷贝,深拷⻉拷贝的是对象(内容), 浅拷贝拷贝的是指针(地址)。
内存管理的原则
《总的原则:谁申请(包括retain)谁释放,引用计数最终平衡》
- 凡是通过retain,alloc,copy等手段获得了所有权的对象,都必须在你不使用他的时候调用release,autorelease等手段来释放对它的所有权。
- 在一定的代码段内,对同一个对象所作的copy,alloc和retain操作次数应当与release和autorelease操作的次数相等。
- 可以在类的dealloc方法中释放你所战友的实例变量。
- 对于便利构造器和访问器来说,并没有通过前面提到的手段获得对象的所有权,因此在这些情况下无需对对象进行额外的释放操作,切记!
先到这里,欢迎补充纠正
不定期更新