1、autorelease使用时注意事项
1)并不是放到自动释放池代码中,都会自动加入到自动释放池 - @autoreleasepool {
- //并不是放到自动释放池代码中,都会自动加入到自动释放池
- //如需释放,要加入到自动释放池中
- //Person *p = [Person new];这样不会被自动销毁
- Person *p = [[Person new] autorelease];//加入自动释放池
- }
复制代码
2)如果调用了autorelease方法,但是调用时对象不在任何自动释放池中,此时该对象也不会加入到自动释放池中。 【注意】以下这种做法原则上是不允许用的,会在释放池销毁时想p发送两次release消息 - @autoreleasepool {
- [p autorelease];
- [p autorelease];
- }
复制代码
3)autorelease嵌套 - //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];
复制代码
|