ARC与MRC

作者: kasakui | 来源:发表于2015-08-03 15:03 被阅读0次

    1. Objective-c语言中的MRC(MannulReference Counting)

    在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,此时内存已释放。

    //autoreleasepool 的使用 在MRC管理模式下,我们摒弃以前的用法,NSAutoreleasePool对象的使用,新手段为@autoreleasepool

    @autoreleasepool {

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

    [num autorelease];            //由autoreleasepool来管理其内存的释放

    }

    对与Objective-c中属性的标识符可以总结为:

    @property (nonatomic/atomic,retain/assign/copy,readonly/readwrite) Number* num;

    (1)nonatomic/atomic,表示该属性是否是对多线程安全的,是不是使用线程锁,默认为atomic,

    (2)retain/assign/copy,是有关对该属性的内存管理的。

    2. Objective-c语言中的ARC(AutomaticReference Counting)

    在ARC中与内存管理有关的标识符,可以分为变量标识符和属性标识符,对于变量默认为__strong,而对于属性默认为unsafe_unretained。也存在autoreleasepool。

    对于变量的标识符有:

    (1) __strong,is the default. An object remains “alive” as long as there is a strong pointerto it.

    (2) __weak,specifies a reference that does not keep the referenced object alive. A weakreference is set to nil when there are no strong references to the object.

    (3)__unsafe_unretained,specifies a reference that does not keep the referenced object alive and is notset to nil when there are no strong references to the object. If the object itreferences is deallocated, the pointer is left dangling.

    (4)__autoreleasing,is used to denote arguments that are passed by reference (id *) and areautoreleased on return,managedby Autoreleasepool.

    对于变量标识符的用法:

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

    在ARC内存管理模式下,其属性的标识符存在以下几种:

    @property (nonatomic/atomic, assign/retain/strong/weak/unsafe_unretained/copy,readonly/readwrite) Number* num;//默认为unsafe_unretained

    其中assign/retain/copy与MRC下property的标识符意义相同,strong类似与retain,assign类似于 unsafe_unretained,strong/weak/unsafe_unretained与ARC下变量标识符意义相同,只是一个用于属性的标识,一个用于变量的标识(带两个下划短线__)。所列出的其他的标识符与MRC下意义相同。

    (1)对于assign,你可以对标量类型(如int)使用这个属性。你可以想象一个float,它不是一个对象,所以它不能retain、copy。

    (2)对于copy,指定应该使用对象的副本(深度复制),前一个值发送一条release消息。基本上像retain,但是没有增加引用计数,是分配一块新的内存来放置它。特别适用于NSString,如果你不想改变现有的,就用这个,因为NSMutableString,也是NSString。

    旧工程配置arc方案:

    1,直接在targets->build phases中修改compiler Flags,是否支持arc。添加:-fobjc-arc,就可以让旧项目支持arc。如果想让原来支持arc的不使用arc则添加-fno-objc-arc

    2,因为在build phases中可以改变是否支持arc,所以应该在代码中添加判断是否支持arc,这样不管以后.m的arc是否改变,都不用再次调整代码。

    相关文章

      网友评论

          本文标题:ARC与MRC

          本文链接:https://www.haomeiwen.com/subject/apsvqttx.html