关于 MRC下自动释放池 的嵌套使用的几个问题

假定存在 Person 这个对象,分析如下代码的对象在何时释放

#import <Foundation/Foundation.h>

#import "Person.h"

int main(int argc, const char * argv[]) {
   
    Person *p1 = nil;
   
    @autoreleasepool
    {
        p1 = [[Person alloc] init];     // p1 1
    }
   
    @autoreleasepool
    {
        [p1 autorelease];
       
        Person *p2 = [[[Person alloc] init] autorelease];   // p2 1
       
        Person *p3 = [[Person alloc] init];     // p3 1
       
        @autoreleasepool
        {
            NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // pool 1
           
            [p3 autorelease];
           
            Person *p4 = [[Person alloc] init];     // p4 1
           
            [pool release];     // pool 0
           
            [p4 autorelease];   // p3 0
        }   // p4 0
    }   // p1 0     p2 0
    return 0;

}

MRC下,自动释放池中的对象何时释放主要取决于对象何时进行 autorelease 操作,也就是说具体看 [对象 autorelease]; 这句代码放在了哪个释放池中.

针对这段代码:

至于对象的释放时间,看各自所在的@autorelease{ }的右半大括号在什么位置,当代码执行到那个位置,该对象就自动释放.

上图中 p3 这个对象比较特殊,图中

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

这种写法是在iOS 5之前的写法,之后的版本都沿用@autorelease{}这种写法;

由于 [p3 autorelease]; 在这个特殊的释放池中间,所以当代码执行到 [pool release]; 这儿时, p3 这个对象就会自动释放.

所以,上面代码中对象的释放顺序是: p3 先释放, p4 再释放,然后 p1 和 p2 再同时释放.

时间: 2024-10-11 17:37:34

关于 MRC下自动释放池 的嵌套使用的几个问题的相关文章

第34条:以“自动释放池块”降低内存峰值

本条要点:(作者总结) Objective-C 对象的生命期取决于其引用计数(参见第29条).在 Objective-C 的引用计数架构中,有一项特性叫做"自动释放池"(autorelease pool).释放对象有两种方式:一种是调用 release 方法,使其保留计数立即递减:另一种是调用 autorelease 方法,将其加入 "自动释放池"中.自动释放池用于存放那些需要稍后某个时刻释放的对象.清空(drain)自动释放池时,系统会向其中的对象发送 relea

黑马程序员--Objective-C之--自动释放池的概念以及使用

今天我们来看一下OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题 // // main.m // 26_NSArrayMemeryManager // // Created by waterfoxjie on 15-03-29. // Copyright (c) 2015年 waterfoxjie. All rights reserved. // #import <Foundation/Foundation.h>

OC学习篇之---数组对象的引用计数问题和自动释放池的概念

之前一片文章中我们介绍了OC中的两个关键字@property和@synthesize的使用的使用: http://blog.csdn.net/jiangwei0910410003/article/details/41925967 今天我们来看一下OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题 // // main.m // 26_NSArrayMemeryManager // // Created by jian

(转载)OC学习篇之---数组对象的引用计数问题和自动释放池的概念

之前一片文章中我们介绍了OC中的两个关键字 @property 和 @synthesize 的使用的使用,今天我们来看一下OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题 1 // 2 // main.m 3 // 26_NSArrayMemeryManager 4 // 5 // Created by jiangwei on 14-10-12. 6 // Copyright (c) 2014年 jiangwei.

黑马程序员-OC学习笔记之autorelease与自动释放池

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.autorelease autorelease与release相似,是OC中的一个对象方法.这两个方法都能把对象的引用计数器减1,但是release是一个精确的减1,对对象的操作只能在release之前进行,如果是在之后,就会出现野指针错误:而autorelease是一个不精确的引用计数器减1,当给对象发送autorelease消息时,对象就会被放到自动

OC中对象元素的引用计数 自动释放池的相关概念

OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题[objc]  view plaincopy 1. //   2. //  main.m   3. //  26_NSArrayMemeryManager   4. //   5. //  Created by jiangwei on 14-10-12.   6. //  Copyright (c) 2014年 jiangwei. All rights reserve

Objective-C(十六、内存管理,自动释放池,ARC,强指针,弱指针,方法族)——iOS开发基础

结合之前的学习笔记以及参考<Objective-C编程全解(第三版)>,对Objective-C知识点进行梳理总结.知识点一直在变,只是作为参考,以苹果官方文档为准~ 十六.内存管理相关知识(二) 1.autorelease,自动释放机制 - (instancetype)autorelease; (1)自动释放池的创建 iOS5.0之前 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; //进行一系列操作 //此处不可以使用

Autorelease自动释放池的使用

Autorelease自动释放池的使用 使用ARC开发,只是在编译时,编译器会根据代码结构自动添加了retain.release和autorelease. MRC内存管理原则:谁申请,谁释放 遇到alloc/copy/retain 都需要添加release或autorelease autorelease 只是一个标记,表明会延迟释放 当一个autorelease对象超出自己的作用域后,会被添加到离他最近的autorelease pool中,当pool开始倾倒的时候,会向池里面所有的对象发送一次r

Foundation框架常用数据类型和NSAutoreleasePool自动释放池解析

第一.NSAutoreleasePool自动释放池解析 1.自动释放池的物理实现 自动释放池用栈来实现,当你创建一个新的自动释放池是,会压栈到栈顶,接受autorelease消息的对象也会被压入到栈顶 NSAutoreleasePool实现延时释放,内部包含一个数组(NSMutableArray),用来保存声名为autorelease的所有对象.如果一个对象声明为autorelease,系统所做的工作就是把这个对象加入到这个数组中去.NSAutoreleasePool自身在销毁的时候,会遍历一遍