ARC概念及原理----个人笔记

//----------------------ARC概念及原理

ARCoc的一个内存管理模式,ARCiOS 5推出的新功能,全称叫 ARC(Automatic Reference Countin)。简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了


指针分类

(1)"强指针":默认的情况下,所有的指针都是强指针,关键字 strong

(2)"弱指针":__weak关键字修饰的指针(两个下划线)


声明一个弱指针如下:

__weak Person *p;


ARC永远不写"retain","release""autorelease"

ARC的判断准则:(当弱类型指向的空间变为nil时,之前的指向空间被释放;如果是强类型,当一个空间中存在多个对象对同一个空间的占有时,即使一个对象指向nil了,只要还存在有对空间的占有对象,它就不会被释放,直到在该释放的地方才结束释放)

只要还有一个"强指针"变量指向对象,对象就会保持在内存中。

"只要没有强指针指向对象,对象就会被释放。"

注意:当使用ARC的时候,暂时忘记"引用计数器",因为判断标准变了


注意:

ARC,dealloc方法不能使用[super dealloc];

//  ARC环境的判断:怎么知道项目是ARC还是MRC

    1:查看项目的配置信息 build setting-all level--->auto--->objective--c  ARC

    2: 查看某些语法是否可用:release/autorelease(查看编译是否通过)

    3: ARC中,能够重写父类的dealloc方法,但是不能使用【super dealloc】(查看编译是否通过)

//---------------------ARC与单对象的内存管理

总结:

1.当栈区的指向对象的局部变量随着代码块的结束,而被释放,对象就没有了强指针引用了,所以也被释放.

2.当对象被 __weak  修饰 (弱指针对象没有被强指针引用就会被"直接释放"


Person *person (指针/局部变量)         =    (堆区/手动管理)          [Person new];


#理解:person 这个栈区的指针(局部变量)  ---指向了----->   堆区的该对象的空间[Person new];



int main(){

    

#   情况一:

    {

    Person *person = [Person new];

    

        

    NSLog(@"----以上释放  /   以下释放-----");

        

    

    }//此处被释放,因为局部变量person在这个地方被释放了,[Person new]没有强指针指向它了,[Person new]被释放

    

//------------------------------------------

 

#   情况二:

    {

    Person *person = [Person new];

    

    person = nil//  person 这个指针指向发生改变, [Person new]没有强指针指向它了,[Person new]被释放

    

    NSLog(@"----以上释放  /   以下释放-----");

        

    }

    

    

//------------------------------------------

    

#   情况三:

    {

    __weak Person *person = [Person new];

    

        //  一开始就是没有强指针指向,创建了就立马销毁了

        

    NSLog(@"----以上释放  /   以下释放-----");

        

    }

    

    return 0;

}



//------------------ARC@property参数

ARC中的@property参数


"strong" : 用于OC对象, 相当于MRC中的"retain"

"weak" : 用于OC对象,释放了之后,会将指针置为nil, 其他相当于MRC中的"assign"

"assign" : 用于基本数据类型, MRC中的assign一样

"copy" : 一般用于NSString, MRC中的copy一样



ARC情况下解决"循环retain"的问题:@property一边用strong,一边用weak


//--------------------ARC下循环引用问题

两个强指针一旦相互引用,会造成无法释放


解决方案:

循环引入的对象中其中一个对象设置为"strong" 另一个设置为"weak"


详细看图


ARC特点总结

1)不允许调用release retain retainCount

 (2)允许重写dealloc 但是不允许调用【super dealloc

 (3)@property的参数:

   strong:相当于原来的retain(适用于oc对象类型) 成员变量是强指针

   weak:相当于原来的assign(同上),成员变量是弱指针

   assign:适用于非oc对象类型(基础类型)


//------------------ARC的兼容和转换(注意兼容与转换之间的区别)

#waring  ARC(兼容)MRC的类 (将某一个文件转换)

target --> Build Phaese   --->   Compiler Sources --> Compiler Flags


让程序兼容ARC和非ARC部分。

转变为非ARC  -fno-objc-arc

转变为ARC, -f-objc-arc


#waring  MRCARC(将整个项目转换)


Xcode --> refactor  -->   Convert to Objective-C ARC   选中要装换的target -->   看代码





转载于:https://my.oschina.net/u/2489126/blog/618952

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值