内存管理ARC(Automatic Reference Counting)&MRC(Manual Retain Counting)&自动释放




本人所写博客均是个人理解,若有错误欢迎大家指正... ...


      iOS中我们均是调用指针来使用数据:使用的数据保存在内存中。手机内存一定所以我们需要对手机的内存进行管理。


IOS5之前我们使用MRC进行手动管理内存,这时我们需要自己申请储存空间自己手动释放内存。


IOS5之后我们使用ARC进行管理内存,换句话说(cocoa管理对象交给手机进行管理)。




内存管理:其实我们需要明白是谁对于内存有拥有权,就像我们自己兜里的钱一样。


MRC中就像我们需要自己挣钱(retain)然后自己负责把钱花掉(release)。


ARC中随着我们经验提升经理,然后就把自己挣钱(内存管理)的机会交给我们手下(ARC)。



ARC中我们申请内存的方式有两种:显示申请(使用alloc,copy) [[NSArray alloc] init];


                                                          隐士申请  [NSArray array]。


ARC在管理内存的实质是引入计数器(count),当我们在使用alloc和copy是计数器就retain加1,所有管理对象放在垃圾回收池中在一定的时间进行释放(释放的时间我们不确定)。




但是身为经理我们也要自己考虑做些事情:


-(NSArray *)array{


     NSArray *array =  [[NSArray alloc] init];


     return array;


}


自动释放池(autoReleasePool)


当我们使用上述方法进行释放内存时应该怎么做呢?


两种方法:(1)在返回前我们使用释放,这样会指针指向垃圾区域。


                  (2)在返回后进行释放,但是函数返回时方法退出。


这样我们目的就项减少计数(release),我们可以采取下列方法。把我们申请的内存放入自动释放池中(autoReleasePool中进行自行释放)


-(NSArray *)array{



     NSArray *array =  [[NSArray alloc] init];



     return [array autorelease];



}


自动释放池的目的(本人理解):是为了释放程序运行过程中内存过大引起CPU过载,起到性能优化。




下面是关于内存管理的拓展:


ARC中知道我们是把内存管理交给Cocoa,换句话说ARC自动管理内存仅仅管理Cocoa的对象。


但是有些不是Cocoa的对象时就需要我们考虑内存管理方法。


(1)当对象时(Void *)指针类型时;


(2)当对象时CFTypeRefs时;


此时我们要通过(_bridge)桥连接的方式来进行强制转换。



下面我们就模拟ARC在MRC情形下对数据进行Retain和Release的操作:




在ARC下:


-(void)method{

NSArray *mArray = [NSArray array];

NSArray

}

我们可以看到在ARC中我们使用NSArray过程,下面是我们仿照ARC对于我们进行的MRC操作(只是模拟操作)。

-(void)method1{

NSArray *mArray = nil;

id

NSArray array];

retain];

    [temp1 release];//因为temp1为nil所以没有任何影响

NSArray *myOtherArray = nil;

id

    myOtherArray = mArray;

retain];

release];

release];

nil;

release];

nil;

}



下面对于我们模仿ARC在MRC进行解释:



(1)*mArray = nil;          是我们防止在MRC中提前释放掉内存然后进行第二次释放内存照成的—>悬浮指针。



(2)id temp1 = mArray;   进行中间变量的赋值可以看出在ARC复制过程中—>引入临时变量指向保留的对象。