ARC简介

1、简介:
ARC(Automatic Reference Counting),自动引用计数,需要XCode4.2和SDK5.0的支持。它是一个在编译期间工作的技术,编译器在编译的时候会根据变量的作用域为objective-c变量添加合适的retain、release、autorelease等函数。原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成。

2、设置XCode为ARC项目:在BuildSettings里面,名为"Objective-C Automatic Reference Counting"的键值,表示此Target是否使用ARC。值类型为BOOL值。

3、ARC的一些规则:
(1).不能调用如下函数(包含隐式调用):retain、release、retainCount、autorelease。
(2).不能调用dealloc。XCode会自动生成delloc方法,不能自己实现,但是如果必须要实现,不能调用[super dealloc]。
(3).不能使用NSAllocateObject和NSDeallocateObjdect。
(4).不能使用自动释放池:NSAutoreleasePool。作为替代,使用@autoreleasepool{ ... }。
(5).不能在c语言结构中使用objective-c指针。
(6).禁止以new开头命名的属性变量。

4、ARC的一个基本规则:只要一个对象被任一strong类型的指针指向,那么它将不会被销毁。如果对象没有被任何strong类型的指针指向,它将被销毁。

5、strong关键字:指向对象,并且持有它;weak关键字:指向对象,但并不持有它;

6、当一个对象不被持有时,它将被销毁,并且所有指向这个对象的weak指针都将被置为nil,从而避免了EXE_BAD_ACCESS这个错误。

7、默认情况下,所有全局变量和局部变量都是strong类型的。

8、release方法的自动添加,是根据变量的作用域来定的。如果是局部变量,方法执行完毕,局部变量就释放了;如果是全局变量,持有此全局变量的对象释放了,全局变量也就释放了。虽然不用再调用retain、release,但是并不是就什么都不做了。在某些情况下,我们仍然需要在合适的地方把strong类型的指针置为nil,否则App会很可能发生内存溢出(延迟释放、 内存警告),比如单例或者一直存在的对象持有的时有时无的Strong类型的变量。

9、当我们只用一些非ARC项目的代码库时,可以设置编译flag,使这些代码不使用ARC编译。从而实现ARC和非ARC的代码混编。flag值:-fno-objc-arc。在Build Phases->Compile Sources中,可以给每一个文件添加此编译值。

10、使用ARC时,strong、weak、autoreleasing类型的变量,会被初始化为nil,打印时会提示”null“,不会crash。

11、property关键字中加入了strong、weak、unsafe_unretained类型。在ARC中,这些类型可以和retain、copy、assign混用,但是出于规则,最好使用新加入的。

12、property类型使用总结(ARC):
(1)strong和retain比较类似,strong关键字对应__strong类型的变量,它将持有所指向的对象。
(2)weak关键字对应__weak类型的变量。weak不持有所指向的对象,而且当所持有的对象销毁时,会将自己置为nil。delegate和outlet都应该用weak来声明。
(3)unsafe_unretained就是assign,在ARC环境中,大部分assign应该都应该被weak代替。但是一些基本类型还是要用assign,比如int、float、bool等。
(4)copy:copy一个对象,并且为其创建一个strong类型的指针。

13、ARC需要SDK5.0的支持,但是Deployment Target最低可以从iOS4开始。weak关键字是iOS5中新加入的,在iOS4中使用unsafe_unretained代替,但是当对象销毁时,它修饰的变量不会被置nil,需要自己手动维护。同样,在iOS4中,输出口用strong代替,在dealloc方法中置nil。

14、置空总结:
(1)strong,retain,copy产生的都是__strong类型的变量,在某些情况下,需要手动置空,第8点有提。
(2)weak类型不会产生野指针,因为当对象销毁时,它会被置nil,所以不用手动维护。
(3)针对objective-c变量,assign产生__unsafe__unretained类型的变量,和unsafe_unretained一样,这些变量在对象销毁时不会被置nil,要自己处理野指针。
(4)针对基本类型,使用assign,没有引用计数。
(5)要延迟释放,使用__autoreleasing关键字。

15.ARC只针对Objective-C的代码。像Core Foundation样式的代码,必须自己调用CFRetain和CGRelease,自己管理内存。当在Objective-C和Core Foundation代码对象类型相互转换时,需要告知编译器由谁来控制释放,方法如下:
(1)__bridge关键字,转换指针类型时不改变控制者;
(2)__bridge__retained或者CFBridgeRetain,把Objective-C类型转换成非Objective-C类型的时候用,然后由非Objective-C代码手动释放。
(3)__bridge__transfer或者CFBridgeRelease,将非Objective-C类型转换成Objective-C类型时用,然后由ARC控制释放。

16、在ARC中防止strong指针循环引用:
(1).如果A和B需要相互引用,则A对B使用strong,B对A使用weak。
(2).ARC在block中的使用:
   在手动管理模式下,对block外部变量使用__block,则变量不会被retain;但是在ARC模式下,变量会仍然会被retain。解决办法如下:使用__weak关键字代替__block关键字。因为ARC不会为__weak指针retain。
(3)可以让循环引用的情况存在,但是在想让循环引用消失的时候,必须有合适的机制能够打破循环引用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值