autorelease就是自动释放,会像C语言的自动变量那样来对待对象实例。当超出作用于时,对象实例的release实例方法被调用。
一、autorelease的具体使用方法如下:
(1)生产并持有NSAutoreleasePool对象;
(2)调用分配对象的autorelease实例方法;
(3)飞起NSAutoreleasePool对象。
NSAutoreleasePool对象的生命周期相当于C语言变量的作用域。对于所有吊用过autorelease实例方法对象,在废弃NSAutoreleasePool对象时,都将调用release实例方法。
用源代码表示如下:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
id obj = [[NSObject alloc]init];
[obj autorelease];
[pool drain];
注意:大量产生autorelease的对象时,只要不废弃NSAutoreleasePool对象,那么生产的对象就不能释放,因此有时会产生内存不足的现象。
Cocoa框架中也有很多类方法用于返回autorelease的对象。比如NSMutableArray类的arrayWithCapacity类方法
id array = [NSMutableArray arrayWithCapacity:1];
此源代码等同于以下源码。
id array = [[[NSMutableArray alloc]initWithCapacity:1]autorelease];
二、autorelease实现
[obj autorelease];
此源代码调用NSObject类的autorelease实例方法。
- (id) autorelease {
[NSAutoreleasePool addObject:self];
}
下面看一下NSAutoreleasePool类的实现。由于NSAutoreleasePool类的源代码比较复杂,所以我们假想一个简化的源代码进行说明。
+ (void)addObject:(id)obj {
NSAutoreleasePool *pool = 取得正在使用的NSAutoreleasePool对象;
if(pool != nil){
[pool addOject:anObj];
}else {
NSLog(@"NSAutoreleasePool对象非存在状态下调用autorelease")
}
}
addObject类方法调用正在使用的NSAutoreleasePool对象的addObject实例方法。
- (void)addObject:(id)anObj {
[array addObject:anObj];
}
总结:如果调用NSObject类的autorelease实例方法,该对象将被追加到正在使用的NSAutoreleasePool 对象中的数组里
以下为通过drain实例方法废弃正在使用的NSAutoreleasePool对象的过程
- (void)drain {
[self dealloc];
}
- (void)dealloc {
[self emptyPool];
[array release];
}
- (void)emptyPool {
for(id obj in array) {//数组里面的所有对象都调用release实例方法
[obj release];
}
}
网友评论