zoukankan      html  css  js  c++  java
  • 关于 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 再同时释放.
     
    我的能力超乎我的想象 我的奋斗决定我的未来
  • 相关阅读:
    MongoDB
    Redis:C#使用Redis
    最大化 AIX 上的 Java 性能,第 4 部分: 监视流量
    最大化 AIX 上的 Java 性能,第 3 部分: 更多就是更好
    最大化 AIX 上的 Java 性能,第 2 部分: 速度需求
    最大化 AIX 上的 Java 性能,第 1 部分: 基础
    阿里面试重点总结
    函数库学习入门指引
    OracleAWR删除历史快照说明
    ActiveMQ实现负载均衡+高可用部署方案(转)
  • 原文地址:https://www.cnblogs.com/zhaoyanpeng/p/4416049.html
Copyright © 2011-2022 走看看