iOS AutoreleasePool(自动释放池子)的原理和实现

前言

hi,勇敢的小伙伴儿们大家好,疫情终于进入一个比较好的阶段,我也在这段时间内经历了很多,有了很多感悟,能在这场大自然的灾难中活下来,都是极其幸运的人啊,致敬那些挡住黑暗的人,致敬如今的美好生活。

珍惜当下。感恩所有。

好了,不啰嗦了,今天为大家分享的是AutoreleasePool这个ARC下的大功臣。

正文

一、AutoreleasePool是什么?

AutoreleasePool是OC中的一种内存自动回收机制,它可以延迟加入AutoreleasePool中的变量的release的时机。

在正常情况下,创建的变量会在超出其作用域的时候release,但是如果将变量加入AutoreleasePool,那么release将延迟执行。

具体用代码来展示:

#import <Foundation/Foundation.h>

//生成两个全局的weak变量用来观察对象,weak修饰后引用计数不变
__weak NSString *weak_String;
__weak NSString *weak_StringAutorelease;

void createString(void) {
    
    NSString *string = [[NSString alloc] initWithFormat:@"Hello, World!"];    // 创建常规对象
    NSString *stringAutorelease = [NSString stringWithFormat:@"Hello, World! Autorelease"]; // 创建autorelease对象
    
    weak_String = string;
    weak_StringAutorelease = stringAutorelease;
    
    NSLog(@"------in the createString()------");
    NSLog(@"%@", weak_String);
    NSLog(@"%@\n\n", weak_StringAutorelease);
}

int main(int argc, char * argv[]) {
    //AutoreleasePool
    @autoreleasepool {
        createString();
        NSLog(@"------in the createString()------");
        NSLog(@"%@", weak_String);
        NSLog(@"%@\n\n", weak_StringAutorelease);
    }
    NSLog(@"------in the main()------");
    NSLog(@"%@", weak_String);
    NSLog(@"%@", weak_StringAutorelease);

    return 0;
}

运行结果如下图所示:

我们可以清楚的看到在creatString方法中,两个对象都是正常存在的,但是在AutoreleasePool中的没有Autorelease的对象已经被释放掉了,而autorelease的对象仍然存在,在AutoreleasePool外,autorelease的对象也被释放掉了。

由此我们可以清楚的看出AutoreleasePool对weak_StringAutorelease对象的延迟释放

二.实现

知道了AutoreleasePool的作用之后,也想知道他的实现吧。

那么调整一下上面的代码,只留下main函数和@autorelease{}

#import <Foundati
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值