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中的“自动释放池”这个知识点,但是,如何去运行用它呢?所以,我们就要通过下方的按钮进入到游戏中,然后,运用它去完成任务,这样,才可以加深大家对每个知识点的理解和运用,以及“尽快进入到编程的状态”。
不要停留在理论规则上面,快动起来吧!
(通过游戏模式学习与训练,需要在电脑上运行)