年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9498|回复: 1

Autorelease的基本使用

[复制链接]
  • TA的每日心情
    奋斗
    2022-12-13 21:26
  • 签到天数: 371 天

    [LV.9]以坛为家II

    发表于 2014-3-19 17:29:43 | 显示全部楼层 |阅读模式
    1、在黄金法则(谁创建谁释放,谁retain,谁release)中,每一个alloc都会对应一个release,但也可以对应一个autorelease
    2、autorelease有两种写法,最新的写法是@autoreleasepool {},以前的写法是创建一个自动释放池的对象,在池被释放之前的代码都属于该释放池的管辖范围,格式如:NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init],再[pool release];
    3、不同的释放池分别占据着不同的作用域,所以不同释放池中的对象可以同名;
    4、自动释放池属于一种栈的数据结果,因此在自动释放池嵌套时,对象自动放入当前栈顶的池中,通俗一点讲,当前对象属于哪个释放池的直接管辖区域,就由哪个池负责释放;
    5、所谓的自动释放器释放对象,并不意味着释放池会对池中的对象真正意义上的释放,实现上只是对所有的对象做一次release操作,仅此而已
    6、一个retain对应一个release,一个retain也可以对应一个autorelease
    参考代码:
    Person.h
    1. //
    2. //  Person.h
    3. //  Autorelease
    4. //
    5. //  Created by yusian on 14-3-19.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import <Foundation/Foundation.h>
    9. @interface Person : NSObject
    10. @property (nonatomic, retain) NSString *name;
    11. @end
    复制代码
    Person.m
    1. //
    2. //  Person.m
    3. //  Autorelease
    4. //
    5. //  Created by yusian on 14-3-19.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import "Person.h"
    9. @implementation Person
    10. - (void)dealloc
    11. {
    12.     // 在对象dealloc之前输出一个标识,表明调用了该方法,为区分对象,加个对象名称
    13.     NSLog(@"Person %@ is dealloc...", _name);
    14.    
    15.     [super dealloc];
    16. }
    17. @end
    复制代码
    main.m
    1. //
    2. //  main.m
    3. //  Autorelease
    4. //
    5. //  Created by yusian on 14-3-19.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import <Foundation/Foundation.h>
    9. #import "Person.h"
    10. int main()
    11. {
    12.     // 创建一个自动释放池
    13.     @autoreleasepool {
    14.         
    15.         Person * p = [[[Person alloc] init] autorelease];
    16.         
    17.         p.name = @"yusian";
    18.         
    19.     }// 自动释放池本身在这里被释放,即所池内的所有对象进行一次release操作
    20.    
    21.     // 以前版本的自动释放池创建方式:
    22.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    23.    
    24.         // 由于不同的作用域,这里的Person对象也可以是p
    25.         Person * p = [[[Person alloc] init] autorelease];
    26.         
    27.         p.name = @"Sim";
    28.    
    29.     // 池释放有两种写法,[pool drain] 或 [pool release]都可以
    30.     [pool drain];  // [pool release];
    31.     return 0;
    32. }
    复制代码
    运行结果:
    2014-03-19 17:16:29.396 Autorelease[2025:303] Person yusian is dealloc...
    2014-03-19 17:16:29.398 Autorelease[2025:303] Person Sim is dealloc...
    Program ended with exit code: 0

  • TA的每日心情
    奋斗
    2022-12-13 21:26
  • 签到天数: 371 天

    [LV.9]以坛为家II

     楼主| 发表于 2014-3-19 22:06:52 | 显示全部楼层
    Person * p = [[[Person alloc] init] autorelease]还可以通过一个类方法来实现,省去每次重复的繁琐

    + (void)person
    {
          return [[[Person alloc] init] autorelease]
    }

    这样就可以直接调用类方法来创建类并且实现autorelease
    Person * p = [[[Person alloc] init] autorelease]可以写成Person * p = [Person person];
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Archiver|iOS开发笔记 ( 湘ICP备14010846号 )

    GMT+8, 2024-5-5 20:47 , Processed in 0.042901 second(s), 19 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表