ARC自动引用计数


启动自动引用计数选项.

选择项目的属性文件 --》 搜索 automatic Reference --》 Objective-C Automatic Reference Counting --》 Yes

ARC 和手动管理内存的区别。

ARC 并不是GC在运行中判断引用计数是否为0,从而清除内存。而是在代码编译之前通过静态分析工具Analyze自动生成内存管理代码。

开启ARC后,不能再使用retain等系列手动内存管的方法,可以重写dealloc方法但不能再方法中[super dealloc]


Core Foundation的东西仍然需要手动release,即以CF打头的对象。因为CF不在ARC的范围内。

未启用ARC之前

 
  1. @implementation NonARCObject
  2. -(id)initWithName:(NSString *)newName {
  3. self = [super init];
  4. if (self) {
  5. [name release] ;
  6. name = [newName retain];
  7. }
  8. return self;
  9. }
  10. -(void)dealloc {
  11. [name release];
  12. [super dealloc];
  13. }
  14. @end

启用ARC之后

 
  1. @implementation NonARCObject
  2. -(id)initWithName:(NSString *)newName {
  3. if (self) {
  4. // 编译器自动加入 [name release]; name = [newName retain];
  5. name = newName;
  6. }
  7. return self;
  8. }
  9. @end

强引用和弱引用

强引用和若引用的概念在ARC环境中才存在。

强引用

强引用指的是会使对象引用计数器+1的引用。类似于retain。
当所有强引用全部release 的时候对象才会被清理。

  • __strong 关键字来定义强引用
  • @property(strong) 来表示强引用属性。

弱引用

弱引用不会使对象引用计数器+1的引用。类似于assgin,直接指针赋值。

  • __weak 关键字来定义弱引用
  • @property(week) 来表示若引用属性。

什么时候使用若引用?

在ARC环境中经常出现父子引用的情况 。

Person 类中具有Child 类对象指针。
Child 类中具有Person 类对象指针。

如果Person 引用的 Child 指针是强引用,并且Child 引用的Person 类也是强引用,将会导致对象无法释放的问题。
1.Person 类释放会去释放 Child
2.Child 类释放的时候又要去释放Person
父子关系都是强引用,释放的时候会出现循环引用无法释放。

使用若引用即可解决,子类含有父类的若引用。

  1. Person 类强引用 Child 类。
  2. Child 类弱引用 Person类。

Person 类释放的时候回去释放Child , Child 发现自身弱引用一个Person 则不会去清理Person,只会将Person 的引用设置为nil ;

若引用引用的对象被清理后,系统自动将引用设置为nil,所以若引用并不会出现僵尸指针的情况

僵尸指针:指向一块被清理掉内存的指针。

智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告