前言
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