半自动释放池是基于 c语言 或者 java,c语言 是 手动释放好,java 是 自动释放池
(1)什么是自动释放池
(2)自动释放池的好处
(3)如何创建一个自动释放池
(4)自动释放池如何释放对象内存
(5)自动释放池栈式结构管理(如果释放池有多个时,系统是怎么管理的)
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; //数组中取数据 NSMutableArray * array = [[[NSMutableArray alloc] init] autorelease]; for(int i=0; i<10; i++) { Params * p = [[[Params alloc] init] autorelease]; p.x = i + 10; [array addObject:p]; // [p release]; } int j = 0; for( Params * nodeP in array) { NSLog(@"i:%d, x:%d\n", j++, nodeP.x); } [pool release];
(1)什么是自动释放池
1、(Autorelease Pool)是OC的一种内存自动回收机制,可以将一些临时变量通过自动释放池来回收统一释放。
2、自动释放池本身销毁的时候,池子里所有对象都会做一次release操作。
3、调用 autorelease 方法,就能把对象放到自己最近的自动释放池中(栈顶的释放池)
创建自动释放池
//ios5.0 新方式
@autoreleasepool
{
}
//ios5.0之前版本
NSAutoreleasePool * pool = [[NSAutorelsasePool alloc] init];
[pool release];
autorelease原理:小丽没有对这条狗拥有权,但小丽无法去释放这条狗,这条狗有流浪中心管理,如果小张和小王release这条狗,流浪中心就会自动回收这条狗
(0)之前:
Dog *dog1 = [[Dog alloc] init];
[xiaoLi setDog:dog1];
[dog1 release];
(1)典型错误:
[xiaoLi setDog:[[Dog alloc] init]];
alloc时,计时器+1了,再引用计数器再+1,xiaoLi销毁了,dog还存在。
(2)正确:
Dog *dog1 = [[[Dog alloc] init] autorelease];
[xiaoLi setDog:dog1];
//这里不能dog1 release,上面狗对这个没有拥有权。
(3)也可以:
[xiaoLi setDog:[[[Dog alloc] init]autorelease]];
//这里的autorelease 不能改为release 因为这样传给小丽的会是一个野指针。
例子:
@autoreleasepool//再这里面声明的局部变量,结束后将自动释放。
{
NSLog(@"hello world!");
}
或者:
NSAutoreleasePool * pool = [[NSAutorelsasePool alloc] init];
NSLog(@"hello world!");
[pool release];//释放自动释放池中的类
(2)自动释放池的好处
(3)如何创建一个自动释放池
(4)自动释放池如何释放对象内存
过去:
Dog *dog1 = [[[Dog alloc] init] autorelese];
写成函数:
.h
+ (id) dog;
.m
+ (id) dog
{
return [[[Dog alloc] init] autorelease];
}main.m
Dog * dog1 = [Dog dog];
(5)自动释放池栈式结构管理
这个池子是个栈结构,所以你将类放入自动释放池都是在栈顶[pool3]那个释放池。
很恐怖的代码:
创建1000次销毁一次自动释放池,再创建一个新的自动释放池。
补充注意例子:
(1)错误:[calculator add:p1 and:p2]这个对象没有释放
(2)错误:result释放了,变成野指针了。
(3)正确,使用自动释放池,在一定情况下会自动释放。
(6)两种构造函数:选择好的构造函数:
1、麻烦(对象方法)
NSNumber * zero_a = [[NSNumber alloc] initWithFloat:0.0f];
...
[zero_a release];
2、简单(类的方法)
NSNumber * zero_a = [NSNumber numberWithFloat:0.0f];
(7)数组自动释放例子:
1、返回是数组
2、形参是数组,array数组已经分配好了。
main.m