您的位置:首页 > 移动开发 > Objective-C

【Objective-C】OC中自动释放池的基本概念和使用方法

2014-02-11 14:53 501 查看
自动释放池的基本概念

   cocoa中有一个自动释放池(AutoreleasePool)的概念,顾名思义,它是可以存放一些实体的

集合,在这个自动释放池中的对象,是能够被自动释放的。NSObject类提供了一个autorelease

消息,当我们向一个对象发送一个autorelease消息时,这个对象就被放入到自动释放池。

创建自动释放池

     @autoreleasepool{
//入池对5.0之后的写法
}

NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
//入池对5.0之前的写法
[poolautorelease];

自动释放池的销毁时间

当我们将一个对象发送了autorelease消息时,当子自动释放池销毁时,会对池中的每一个对象

发送一条release消息,以此来进行释放它们。


(一):下面来看实例:创建一个Person实例对象,然后加入到自动释放池中,向该实例对象发送一条autorelease消息,

来查看一下它的生命周期)

@autoreleasepool{
//入池对5.0之后的写法
Person*tom=[[Personalloc]init];
[tomautorelease];
NSLog(@"poolexist");
}
NSLog(@"pooldead");



(二):接着上面的例子,向该对象发送一条retain消息,看下声明周期

@autoreleasepool{
//入池对5.0之后的写法
Person*tom=[[Personalloc]init];//1
[tomautorelease];
[tomretain];//2
NSLog(@"poolexist");
NSLog(@"tom%ld",[tomretainCount]);
[tomrelease];//1
NSLog(@"tom%ld",[tomretainCount]);



(三):接着上面的例子,如果有多个自动释放池的问题,根据发送的autorelease消息来进行判断是

对象加入的那个自动释放池,

@autoreleasepool{
Person*tom=[[Personalloc]init];//1
@autoreleasepool{
//入池对5.0之后的写法
[tomautorelease];
[tomretain];
NSLog(@"poolexist");
NSLog(@"tom1%ld",[tomretainCount]);

}
NSLog(@"pool1dead");
NSLog(@"tom2%ld",[tomretainCount]);

}
NSLog(@"pool2dead");




【小结】:

1:自动释放池的数据结构

自动释放池是以栈的形式实现,当你创建一个新的自动释放池,它将会被添加到栈顶。接受autorelease

消息的对象将会呗放入栈顶

2:如何持有对象

当我们使用alloc,copy,retain对象获取一个对象时,我们需要负责显示的安排对象的销毁,其他方法获取的

的对象将交给自动释放池进行释放(单例模式除外)

3:release和drain的区别

当我们向自动释放池pool发送release消息,将会向池中临时对象发送一条release消息,并且自身也会呗销毁。

向它发送drain消息时,只会指定前者。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息