/************************main.m************************/
程序设计目的:了解自动释放池嵌套使用的方法,
通过查看对象str是否还存在来判断str的自动释放归属权
到底归属于谁。
/
#import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc,constchar * argv[])
{
/*
dog_d 应该是被放在pool_3里面的,不是pool_1或者pool_4
指针的赋值,可以拥有对象的使用权,弱引用,
autorelease的对象放在离自己最近的,放在栈顶的自动释放池里面?栈顶
自动释放池不可穿插使用,一个释放池里面不能包含另一个自动释放池的头,除非把头和尾都加进来,
否则由于自己的释放而把别的池子也释放了,
嵌套使用的自动释放池的释放是从里到外的释放。
“{}”“【】”“()”分别表示三个释放池,释放池的使用应该遵循下图的嵌套使用原则
{【()】}
而不可以是这样的:{【 }()】
如果这样大括号“{}”结束时会连带把“【】”释放池也释放掉。
对于在嵌套释放池内部定义的自动释放对象,其释放权到底归谁所有
例如:【( { [dog autorelease] })】,经过试验得出结论,只要dog在嵌套释放池里面,dog就归属它所在的释放池所有。
*/
NSAutoreleasePool *pool_3 = [[NSAutoreleasePoolalloc]init];
NSAutoreleasePool *pool_2 = [[NSAutoreleasePoolalloc]init];
NSAutoreleasePool *pool_1= [[NSAutoreleasePoolalloc]init];
NSString *str = [[[NSStringalloc]initWithString:@"I'm Live"]autorelease];
NSLog(@"%@",str);
[pool_1release];
NSLog(@"pool_1.released!\n\n");
NSLog(@"%@",str);
[pool_2release];
NSLog(@"pool_2.released!\n\n");
NSLog(@"%@",str);
[pool_3release];
NSLog(@"pool_3.released!");
NSLog(@"%@",str);
return0;
}