6、内存管理(自动释放池)-OC

半自动释放池是基于 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


 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值