A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1、autorelease使用时注意事项

1)并不是放到自动释放池代码中,都会自动加入到自动释放池
  1.     @autoreleasepool {
  2.         //并不是放到自动释放池代码中,都会自动加入到自动释放池
  3.         //如需释放,要加入到自动释放池中
  4.         //Person *p = [Person new];这样不会被自动销毁
  5.         Person *p = [[Person new] autorelease];//加入自动释放池
  6.     }
复制代码


2)如果调用了autorelease方法,但是调用时对象不在任何自动释放池中,此时该对象也不会加入到自动释放池中。
【注意】以下这种做法原则上是不允许用的,会在释放池销毁时想p发送两次release消息
  1.             @autoreleasepool {
  2.                 [p autorelease];
  3.                 [p autorelease];
  4.             }
复制代码



3)autorelease嵌套
  1. //autorelease嵌套
  2.     //自动释放池的栈结构(一种数据结构)跟内存中的栈区是不一样的
  3.     Person *p = [Person new]; //p的计数器值 1
  4.     [p retain];//p的计数器值 2
  5.     [p retain];//p的计数器值 3
  6.     @autoreleasepool {
  7.         @autoreleasepool {
  8.             @autoreleasepool {
  9.                 NSLog(@"p retainCount = %lu",p.retainCount);
  10.                 [p autorelease];
  11.             }
  12.             [p autorelease];
  13.             NSLog(@"p retainCount = %lu",p.retainCount);
  14.         }
  15.         [p autorelease];
  16.         NSLog(@"p retainCount = %lu",p.retainCount);
  17.     }
复制代码

打印结果:
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
例如:
  1.             @autoreleasepool {
  2.                 [p autorelease];
  3.             }
  4.             [p release];
复制代码



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马