黑马程序员--OC内存管理机制(下)之ARC

来源:互联网 发布:网店美工是做什么的 编辑:程序博客网 时间:2024/06/05 02:05

 ----------------------ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------




三、关于ARC(Auto reference counting)自动引用计数

  1、基本简介

     ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain、release、autorelease语句。你不再需要担心内存管理,因为编译器为你处理了一切

    ARC 是编译器特性,而不是 iOS 运行时特性,它也不是类似于其它语言中的垃圾收集器。因此 ARC 和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化

   2、当你在编译程序的时候提供自动管理内存的功能,它会自动加入内存的控制代码,控制对象的生命周期,大大简化了内存管理的步骤,ARC管理内容的原理就是,编译器会在适当的地方自动插入retain、release和autorelease消息,要使用此方法,可以在Xcode中创建项目时勾选

如图:

在新建MAC的命令行程序时:



 

当在创建IOS工程时:


3、垃圾回收机制

  类似与java中的垃圾回收机制,Objective-c在2.0以后也提供了垃圾回收机制,但是在IOS 中并不支持。但是我们要明白的是垃圾回收机制并不是ARC,ARC也是需要管理内存的,只不过是隐式的管理内存

4、基本原理

(1)指针分类:

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

弱指针:_ _weak关键字修饰的指针

声明一个弱指针如下:

_ _weak Person *p;

ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空操作。

_ _weak Person *p=[[Personalloc]  init];//不合理,对象一创建出来就被释放掉,对象释放掉后,ARC把指针自动清零。

ARC中在property处不再使用retain,而是使用strong,在dealloc中不需要再[superdealloc]。

@property(nonatomic,strong)Dog *dog;// 意味着生成的成员变量_dog是一个强指针,相当于以前的retain。

如果换成是弱指针,则换成weak,不需要加_ _。

(2)规则:ARC 的规则非常简单:只要还有一个强指针变量指向对象,对象就会保持在内存中

(3)强指针和弱指针

      默认所有实例变量和局部变量都是Strong指针

      弱指针指向的对象被回收后,弱指针会自动变为nil指针,不会引发野指针错误

5、使用注意

(1不能调用release、retain、autorelease、retainCount

(2可以重写dealloc,但是不能调用[super dealloc]

(3)@property :想长期拥有某个对象,应该用strong,其他对象用weak

(4其他基本数据类型依然用assign

(5两端互相引用时,一端用strong、一端用weak

 


----------------------ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

0 0
原创粉丝点击