———-android培训、Java培训、iOS培训,期待与您交流———-
一、基本概念
1. 为什么要进行内存管理?
由于对象存储在内存的堆中,而除了对象之外的其他局部变量存储在栈中,当当前代码块结束时,系统会自动回收存储在栈中的数据,指向对象的指针也会被自动回收。此时没有指针指向对象,而对象依然存在在内存中,会造成内存泄漏。
如上图所示,在OC中所要管理的内存,就是存储在堆区的对象实例。
2. OC提供的三种内存管理方式:
- Mannual Reference Counting(MRC,手动管理,在iOS4.1之前必须使用MRC)
- Automatic Reference Counting(ARC,自动引用计数,iOS4.1之后推出)
- Garbage Collection(垃圾回收,iOS不支持,仅在开发Mac app时使用)
注:开发中尽量使用ARC
3. 关于引用计数(Reference Counting)
每个对象都有一个与之相关联的整数,被称作它的引用计数。当某段代码需要访问一个对象时,这个对象的引用计数就加1。当这段代码结束对象访问时,这个对象的引用计数就减1。当对象的引用计数为0时,就表示不再有代码访问该对象了,因此他将被删除,所占用的内存会被系统回收。
创建一个新的对象时(包括使用alloc、new和copy),该对象的引用计数被设置为1。使用retain(返回值为当前对象)方法可以使引用计数加1,使用release(返回值为空)则可以使引用计数减1,使用retainCount可以获得对象当前的引用计数值(返回值的类型为NSUInteger)。
当一个对象的引用计数为0时,会自动调用dealloc方法,这样,该对象就能被从内存中释放掉。
二、手动内存管理(MRC)
1. 开启MRC
由于目前的OC项目默认是关闭MRC的,所以需要手动开启。具体方法如下:
选中项目 -> Build Setting -> Basic -> levels -> 搜索auto -> 把ARC改为NO。
2. 基本应用举例
假设已经有对象Car。在main.m中:
#import <Foundation/Foundation.h>
#import "Car.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Car *c = [Car new];
NSUInteger count