假定存在 Person 这个对象,分析如下代码的对象在何时释放
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
Person *p1 = nil;
@autoreleasepool
{
p1 = [[Person alloc] init]; // p1 1
}
@autoreleasepool
{
[p1 autorelease];
Person *p2 = [[[Person alloc] init] autorelease]; // p2 1
Person *p3 = [[Person alloc] init]; // p3 1
@autoreleasepool
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // pool 1
[p3 autorelease];
Person *p4 = [[Person alloc] init]; // p4 1
[pool release]; // pool 0
[p4 autorelease]; // p3 0
} // p4 0
} // p1 0 p2 0
return 0;
}
MRC下,自动释放池中的对象何时释放主要取决于对象何时进行 autorelease 操作,也就是说具体看 [对象 autorelease]; 这句代码放在了哪个释放池中.
针对这段代码:
至于对象的释放时间,看各自所在的@autorelease{ }的右半大括号在什么位置,当代码执行到那个位置,该对象就自动释放.
上图中 p3 这个对象比较特殊,图中
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
这种写法是在iOS 5之前的写法,之后的版本都沿用@autorelease{}这种写法;
由于 [p3 autorelease]; 在这个特殊的释放池中间,所以当代码执行到 [pool release]; 这儿时, p3 这个对象就会自动释放.
所以,上面代码中对象的释放顺序是: p3 先释放, p4 再释放,然后 p1 和 p2 再同时释放.