ARC 总结

来源:互联网 发布:腾讯游戏礼包领取软件 编辑:程序博客网 时间:2024/06/05 13:30

在MRC的内存管理模式下,与对变量的管理相关的方法有:retain,release和autorelease。retain和release方法操作的是引用记数,当引用记数为零时,便自动释放内存。并且可以用NSAutoreleasePool对象,对加入自动释放池(autorelease调用)的变量进行管理,当drain时回收内存。

(1)      retain,该方法的作用是将内存数据的所有权附给另一指针变量,引用数加1,即retainCount+= 1;

(2)      release,该方法是释放指针变量对内存数据的所有权,引用数减1,即retainCount-= 1;

(3)      autorelease,该方法是将该对象内存的管理放到autoreleasepool中。

示例代码:

//假设Number为预定义的类

Number* num = [[Number alloc] init];

Number* num2 = [num retain];//此时引用记数+1,现为2

[num2 release]; //num2 释放对内存数据的所有权 引用记数-1,现为1;

[num release];//num释放对内存数据的所有权 引用记数-1,现为0;

[num add:1 and 2];//bug,此时内存已释放。


ARC是编译器(时)特性,而不是运行时特性,更不是垃圾回收器(GC),编译时插入相应的retian release。

   1.ARC帮我们添加或是减少引用计数,并不是简单的发消息机制-retain、release,而是调用底层的objc_retain、objc_release.  
   2.使用ARC必须遵循方法命名规则, -alloc -new -copy -mutabelCopy 以这些单词开头的函数返回的对象归调用者所有,也就是其内存归调用者管理了,若不是这些单词开头的不归调用者所有,可能在当前线程执行下次runloop event 前回收【没有被@autoreleasepool{}包着】
   3.ARC不仅可以像第一条那样管理引用技术,而且还可以优化掉一些可优化的加减引用计数。
      例如, +(SomeObj) theObj { return [[SomeObj alloc ] init] ; //返回的对象其实是autorelease的}        
                  _someObjInstance = [SomeObj theObj];
                  若非ARC应该这么写 SomeObj * temp = [SomeObj alloc ] init] ;    
                  [temp autorelease];
                  SomeObj * temp =  [SomeObj theObj];
                  [temp retain];
     ARC会在运行期检测这一对多余操作,进行优化,检测autorelease后有retain不执行autorelease,设置全局数据结构中的一个标志位,相应的retain前检测那个标志位,相应地也不执行retain操作了。
  4.使用ARC不用考虑一些边界情况。 非ARC下这样写的话。
     -(void)setObject:(id)obj {
         [_object release];
         _object = [obj retain];
     }
     这种情况下如果新值旧值相同那么,这个值先减一后会使计数变为0,接下来执行保留操作会使程序崩溃,ARC会用一种安全的方式,先保留新值再释放旧值,无需考虑这种情况了。
     -(void)setObject:(id)obj {
         [obj retain];
         [_object release];
         _object =obj;
     }
   5.ARC会自动生成回收对象所执行的代码,通常无需在编写dealloc方法,但是coreFondation或是由malloc分配在堆中的内存扔需要清理。





1 0