autoreleasepool

转自: http://www.cocoachina.com/ios/20150610/12093.html



首先了解下面三个知识:

1. __weak NSString *string_weak_ = nil;  weak变量在它指向的对象被释放后,weak变量的值会被置为nil

2. 作用域

3. 变量在 = 号右边时,该变量会被retain一次,引用计数+1

4. 变量出了作用域时,会被release一次

5. 变量在autoreleasepool结束时,会被release一次

6. 执行了- (void)viewWillAppear:(BOOL)animated {}后,viewDidLoad中系统创建释放池X被销毁,其中的所有对象release一次。


下面是源码:

#import "ViewController.h"


@interface ViewController ()


@end


@implementation ViewController

__weak NSString *string_weak_ = nil;

- (void)viewDidLoad {

    [super viewDidLoad];

    // 场景 1

    

//    NSString *string = [NSString stringWithFormat:@"leichunfeng"];

//    string_weak_ = string;

//

    

    // 场景 2

//        @autoreleasepool {

//            NSString *string = [NSString stringWithFormat:@"leichunfeng"];

//            string_weak_ = string;

//        }

    // 场景 3

        NSString *string = nil;

        @autoreleasepool {

            string = [NSString stringWithFormat:@"leichunfeng"];

            string_weak_ = string;

        }

    NSLog(@"string: %@", string_weak_);

}

- (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    NSLog(@"string: %@", string_weak_);

}

- (void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];

    NSLog(@"string: %@", string_weak_);

}

@end




场景1中:string的作用域是  - ( void )viewDidLoad {} 。

NSString *string = [NSString stringWithFormat:@"leichunfeng"]; 创建string引用计数 = 1,自动放入了系统的自动释放池X里面

string_weak_ = string; 被引用了一次,string引用计数 = 2

出了作用域后string引用计数 = 1 

执行了- (void)viewWillAppear:(BOOL)animated {}后,viewDidLoad中系统创建释放池X被销毁,其中的所有对象release一次。string的引用计数= 0.所以结果如下


场景2中:string的作用域是 @autoleasepool{} ,出了作用域之后,string的引用计数 -1 ,释放池结束后引用计数-1 所以打印出来的都为空
场景3中:string的作用域是 - ( void )viewDidLoad {} ,释放池结束后,引用计数由2 -1 = 1,可以nslog出来,但出了作用域之后,引用计数再-1.所以只有第一次打印有结果

// 场景 1
2015-05-30 10:32:20.837 AutoreleasePool[33876:1448343] string: leichunfeng 此时 = 2
2015-05-30 10:32:20.838 AutoreleasePool[33876:1448343] string: leichunfeng 此时出作用域 -1
2015-05-30 10:32:20.845 AutoreleasePool[33876:1448343] string: ( null ) 此时释放池已经被销毁了

// 场景 2
2015-05-30 10:32:50.548 AutoreleasePool[33915:1448912] string: ( null )
2015-05-30 10:32:50.549 AutoreleasePool[33915:1448912] string: ( null )
2015-05-30 10:32:50.555 AutoreleasePool[33915:1448912] string: ( null )
// 场景 3
2015-05-30 10:33:07.075 AutoreleasePool[33984:1449418] string: leichunfeng
2015-05-30 10:33:07.075 AutoreleasePool[33984:1449418] string: ( null )
2015-05-30 10:33:07.094 AutoreleasePool[33984:1449418] string: ( null )



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值