黑马程序员--IOS学习日记:07--内存管理之引用计数器

来源:互联网 发布:棉花期货天狼星软件 编辑:程序博客网 时间:2024/04/30 07:58

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、内存管理

   内存管理关心的是清理(回收)不用的内存,以便能够再次利用。如果一个对象不再使用,就需要释放对象占用的内存。这听起来简单。然而,事实上并不是那么简单。为了能够进行内存管理,人们已经开发出多种内存管理策略。在Xcode 4.2 发布以前,程序员需要细致处理引用计数,使用保留(retain)、释放(release)和自动释放(autorelease),才能让开发的应用能够明智地处理内存使用,并且在大多数时候不会崩溃。但结果常常导致试图去引用的对象已经在无意间销毁了。 Xcode 4.2 版本发布以后,有一个新特性是自动引用计数(Automatic Reference Counting, ARC),程序员不再思考内存管理方面的问题。但为了方便开发,我们应该熟悉内存管理的策略。

   提供给OC程序员的基本内存管理模型有以下三种:

1>自动垃圾收集

2>手工引用计数和自动释放池

3>自动引用计数(ARC)

    内存管理的范围:任何继承了NSObject的对象,对其他数据类型(int、char、float、double、struct、enum等)无效


二、引用计数器

1. 每个OC对象都有自己的引用计数器,是一个整数,表示“对象被引用的次数”,即有多少人正在使用这个OC对象

2. 每个OC对象内部专门有4个字节的存储空间来存储引用计数器 

3引用计数器的作用

 1>当使用alloc、new或者copy创建一个新对象时,新对象的引用计数器默认就是1

   当一个对象的引用计数器值为0时,对象占用的内存就会被系统回收。换句话说,如果对象的计数器不为0,那么    在整个程序运行过程,它占用的内存就不可能被回收,除非整个程序已经退出

4.引用计数器的操作

 1>给对象发送一条retain消息,可以使引用计数器值+1retain方法返回对象本身)

 2>给对象发送一条release消息,可以使引用计数器值-1

 3>可以给对象发送retainCount消息获得当前的引用计数器值

5.对象的销毁

  1>当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收

 2>当一个对象被销毁时,系统会自动向对象发送一条dealloc消息

  3>一般会重写dealloc方法,在这里释放相关资源,dealloc就像对象的遗言

 4>一旦重写了dealloc方法,就必须调用[super dealloc],并且放在最后面调用

 5>不要直接调用dealloc方法

 6>一旦对象被回收了,它占用的内存就不再可用,坚持使用会导致程序崩溃(野指针错误)


三、方法的基本使用
  

 1.方法的基本使用

 1> retain :计数器+1,会返回对象本身
 2> release :计数器-1,没有返回值
 3> retainCount :获取当前的计数器
 4> dealloc
  * 当一个对象要被回收的时候,就会调用
  * 一定要调用[super dealloc],这句调用要放在最后面
 
 2.概念
 1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象不能再使用
 2> 野指针 :指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)
 3> 空指针 :没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错


实例:

#import <Foundation/Foundation.h>    @interface Person : NSObject    @property int age;    @end 

#import "Person.h"    @implementation Person      // 当一个Person对象被回收的时候,就会自动调用这个方法  - (void)dealloc  {      NSLog(@"Person对象被回收");            // super的dealloc一定要调用,而且放在最后面      [super dealloc];  }    @end  

int main()  {      // 1      Person *p = [[Person alloc] init];                              // 2 retain方法返回的是对象本身      [p retain];            // 1      [p release];            // 0 野指针:指向僵尸对象(不可用内存)的指针      [p release];            [p retain];            // -[Person setAge:]: message sent to deallocated instance 0x100109a10      // 给已经释放的对象发送了一条-setAge:消息:      p.age = 10;      //[p setAge:10];            // 指针p变成空指针      //p = nil;            // EXC_BAD_ACCESS : 访问了一块坏的内存(已经被回收、已经不可用的内存      // 野指针错误      // OC不存在空指针错误,给空指针发送消息,不报错      [p release];      [p release];      [p release];      [p release];            [nil release];            return 0;  }  


0 0
原创粉丝点击