Objective-C 自动释放池

 

  在接下来的时间里面,我们准备为大家介绍Objective-C中的"自动释放池"。

 

  (1)在前面的学习中,我们已经学习了如何运行release与dealloc去释放内存空间,同时,当调用

     release时,它是会立即对引用数减1,但是,在有些情况下面,我们是不希望立即对引用数

     减1。

 

     例如,在一个方法中,我们定义了一个对象并分配了内存空间,然后,再把对象返回给调用

     该方法的代码,那么,在这种情况下,虽然,方法调用已经结束了,但是,我们不能立即把

     对象的内存空间释放掉,所以,就需要使用“自动释放池”来进行延迟释放操作。

  

  (2)自动释放池使用的步骤

     1、创建自动释放池对象。

     2、往自动释放池中添加要减少引用数的对象。

     3、让自动释放池对象调用release,这样,就可以把自动释放池中的对象引用数减1。

 

 

 

 

  (1)创建自动释放池对象的语法格式:

     NSAutoreleasePool *对象名 = [[ NSAutoreleasePool alloc ]init ];

     

     语法格式分析:

     1、NSAutoreleasePool 是一个自动释放池类。

     2、自动释放池的对象,按变量命名规则定义即可。

     3、后面的内容与对象定义时分配内存空间的格式是一样的,都是通过类名调用alloc分配

       内存空间,并通过init 进行初始化。

 

  (2)往自动释放池中添加要减少引用数的对象:

     [ 对象 autorelease ];

     

     语法格式分析:

     1、一对中括号。

     2、对象,已经定义并分配内存空间,否则会报错。

     3、调用autorelease 方法将要减少引用数的对象添加到自动释放池中。

 

  (3)让自动释放池对象调用release的语法格式:

     [ 对象 release ];

     

     语法格式分析:

     1、自动释放池类的对象。

     2、调用 release 方法,在该方调用时,会先对自动释放池中的所有对象的引用数减1,

       当自动释放池中的对象引用数为0时,系统就会自动调用dealloc释放对象所占用的内存

       空间,最后,再释放“自动释放池”对象所占用的内存空间。

        

 

 

 接下来,我们结合例子作进一步的学习。

 

//===================//

//-------定义了Role类------//

//===================//

@interface Role : NSObject  

{

 @public

  int x;

  int y;
}

@end




//-------入口函数main-----//

int main (int argc, const char * argv[]) {

 

 NSAutoreleasePool  * pool  =  [ [ NSAutoreleasePool alloc ] init ] ;//定义了自动释放池对象pool

 

 

 Role  *r1 = [ [ Role alloc ] init ];  //通过类Role定义了对象r1,并分配了内存空间与初始化。

 

 

 [ r1  autorelease ]; //把r1对象放入自动释放池中

 

 [ pool  release ]; //自动释放池对象pool 调用了release方法,所以,自动释放池会先把池中的

            对象引用数减1,而池中的当前对象只有r1,同时它的引用数是1,所以,

            r1的引用数减1以后,就变为0,然后,系统自动为r1对象调用

            dealloc方法来释放r1对象所占用的内存空间。

 

            然后,在处理完池中的对象以后,再为pool 调用 release方法,让pool 对象

            的引用数减1,这样,pool 对象的引用数就变为0,然后,系统就为

            pool 对象自动调用dealloc方法去释放pool 对象所占用的内存资源。

}

 

 

 

  非常好,现在,我们已经掌握了Objective-C中的“自动释放池”这个知识点,但是,如何去运行用它呢?所以,我们就要通过下方的按钮进入到游戏中,然后,运用它去完成任务,这样,才可以加深大家对每个知识点的理解和运用,以及“尽快进入到编程的状态”

 

  不要停留在理论规则上面,快动起来吧!

 

 

(通过游戏模式学习与训练,需要在电脑上运行)

进入游戏学习与训练