原理iOS plusiOS日常须知

OC高级-autoreleasepool的实现原理

2016-08-22  本文已影响720人  yanhooIT

目录

autorelease的本质

autorelease对象什么时候释放?

实验环境

__weak NSString *_weakStr = nil;
- (void)viewDidLoad
{
    [super viewDidLoad];

    // 场景 1
    NSString *string = [NSString stringWithFormat:@"yanhoo"];
    _weakStr = string;

    // 场景 2
//    @autoreleasepool {
//        NSString *string = [NSString stringWithFormat:@"yanhoo"];
//        _weakStr = string;
//    }

    // 场景 3
//    NSString *string = nil;
//    @autoreleasepool {
//        string = [NSString stringWithFormat:@"yanhoo"];
//        _weakStr = string;
//    }

    NSLog(@"string1: %@", _weakStr);
}

- (void)viewWillAppear:(BOOL)animated 
{
    [super viewWillAppear:animated];

    NSLog(@"string2: %@", _weakStr);
}

- (void)viewDidAppear:(BOOL)animated 
{
    [super viewDidAppear:animated];

    NSLog(@"string3: %@", _weakStr);
}

测试结果

场景1
2016-08-19 01:30:01.686 test[8866:554553] string1: yanhoo
2016-08-19 01:30:01.687 test[8866:554553] string2: yanhoo
2016-08-19 01:30:01.695 test[8866:554553] string3: (null)

场景2
2016-08-19 01:32:07.020 test[8886:556042] string1: (null)
2016-08-19 01:32:07.021 test[8886:556042] string2: (null)
2016-08-19 01:32:07.032 test[8886:556042] string3: (null)

场景3
2016-08-19 01:32:57.038 test[8900:557349] string1: yanhoo
2016-08-19 01:32:57.038 test[8900:557349] string2: (null)
2016-08-19 01:32:57.048 test[8900:557349] string3: (null)

分析

autoreleasepool的工作原理

// push
void *poolToken = objc_autoreleasePoolPush();

// 这中间为写在{...}中的代码

// pop
objc_autoreleasePoolPop(poolToken);

autoreleasepool的内部结构

autoreleasepool的嵌套

AutoreleasePoolPage

NSThread、NSRunLoop 和 NSAutoreleasePool三者之间的关系

Autorelease返回值的快速释放机制

其他Autorelease相关知识点

[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
{ 
      // 这里被一个局部@autoreleasepool{ }包围着
}];

面试题

参考文章

上一篇 下一篇

猜你喜欢

热点阅读