黑马程序员---OC学习笔记之autorelease注意及错误用法

------Java培训、Android培训、iOS培训、.Net培训--------

1、autorelease使用时注意事项

 

1)并不是放到自动释放池代码中,都会自动加入到自动释放池

    @autoreleasepool {
        //并不是放到自动释放池代码中,都会自动加入到自动释放池
        //如需释放,要加入到自动释放池中
        //Person *p = [Person new];这样不会被自动销毁
        Person *p = [[Person new] autorelease];//加入自动释放池
   }


2)如果调用了autorelease方法,但是调用时对象不在任何自动释放池中,此时该对象也不会加入到自动释放池中。

【注意】以下这种做法原则上是不允许用的,会在释放池销毁时想p发送两次release消息

            @autoreleasepool {
               [p autorelease];
               [p autorelease];
           }

 

3autorelease嵌套

 

  //autorelease嵌套
    //自动释放池的栈结构(一种数据结构)跟内存中的栈区是不一样的
    Person *p = [Person new];//p的计数器值 1
    [p retain];//p的计数器值 2
    [p retain];//p的计数器值 3
    @autoreleasepool {
        @autoreleasepool {
            @autoreleasepool {
               NSLog(@"p retainCount = %lu",p.retainCount);
               [p autorelease];
           }
            [p autorelease];
            NSLog(@"p retainCount= %lu",p.retainCount);
       }
        [p autorelease];
        NSLog(@"p retainCount= %lu",p.retainCount);
   }

打印结果:

2015-10-06 20:53:42.109 MRCDemo[2891:303] pretainCount = 3

2015-10-06 20:53:42.111 MRCDemo[2891:303] pretainCount = 2

2015-10-06 20:53:42.112 MRCDemo[2891:303] pretainCount = 1

2015-10-06 20:53:42.112 MRCDemo[2891:303] This persondead....

 

4)自动释放池中不适宜放占用内存较大的对象

A、尽量比卖弄对大内存使用该方法,对于这种延迟释放机制,还是尽量少用

B、不要把大量循环操作放到同一个@autoreleasepool中,这样会造成内存峰值生升

 

2、autorelease的错误用法

1)连续多次调用autorelease,释放池销毁时多次执行release

2)alloc之后调用了autorelease,之后又调用了release

例如:

            @autoreleasepool {
               [p autorelease];
           }
            [p release];


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值