Autorelease Pools(自动释放池)
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
Retain/release
方法很好,但在某些时候,会有问题出现。
比如当一个对象需要被转移或者转手到其他地方的时候,在你的转移对象代码里面,你并不想retain
这个对象,但是你更不想在对象被转移之前就被回收了,怎么办?
于是Objective-C语言提供Autorelease Pools
(自动释放池)来解决这个问题。
Autorelease Pools
提供一种特殊的机制,当对象放入池子后,将会被retain
一个有限的时间段。这个时间段足够将对象转移到其他地方了(延时)。这个机制用autorelease
方法来代替原来的release
方法。Autorelease
首先将对象加入到已经激活的池子中,并且retain
它。过一段时间再发送一个release
消息给这个对象。在一段时间过后,池子会再次给对象发送一个release
消息,但是在这个时间段里,有可能被其他对象retain
了,也可能因为因为不再被需要,所以被dealloc
了。请看如下代码:
- (NSString *) getStatus
{
NSString *status =
[[NSString alloc] initWithFormat: "Count is %d", [self getCount]];
//设置status在将来的某一时刻release
[status autorelease];
return status;
}
任何一个调用-getStatus
方法的代码块如果仅仅是想使用一下从getStatus
返回的NSString类的对象,则完全无需去retain
它。但是如果需要存储从getStatus
返回的对象供以后使用,则必须再一次retain
它。代码如下:
...
NSString *status = [foo getStatus];
// 'status' 对象这个时候还在autorelease pool中
NSLog(status);
return;
// status将会被autorelease pool释放掉
...
currentStatus = [foo getStatus];
// currentStatus 是一个实例变量,我们不想以后某个时间被autorelease pool给释放掉,我们需要长期存储这个对象,所以我们必须自己动手retain这个对象
[currentStatus retain];
在线练习
{$ activeFileHint $}