iOS Autorelease Pool (自动释放池)
2017-06-08 本文已影响0人
guoshengboy
我们都知道在内存管理中有2种释放内存,一种是[ objc release] 直接释放 还有一种是 [objc autorelease].当对象调用autorelease时,会将对象加入自动释放池中。自动释放池会在将来的某一时刻将存在池中的对象释放掉。清空自动释放时,系统会向其中的对象发送release消息。
我们知道自动释放池就是把其作用域里调用autorelease的对象存放的地方,在将来的某一时刻将存在池中的对象释放掉。那么他有什么作用呢?
一般不用我们创建自动释放池,主线程和gcd默认都有自动释放池。
用于容纳UIApplicationMain函数所自动释放的那些对象
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
1.降低内存峰值
NSMutableArray *array = [[NSMutableArray alloc] init];
for (int i = 0; i < 10000; i++) {
NSString *str = [NSString stringWithFormat:@"123"];
[array addObject:str];
}
上述代码里的str临时变量 arc会帮我们自动释放池中,等下时机释放。但我们在短时间内往里面加入太多,会导致内存猛增.所以我们可以这样
NSMutableArray *array = [[NSMutableArray alloc] init];
for (int i = 0; i < 10000; i++) {
@autoreleasepool {
NSString *str = [NSString stringWithFormat:@"123"];
[array addObject:str];
}
}
这样写str放入我们新创建的自动释放池中,当走到块末尾,会清空池中的对象,降低内存峰值。当然一般只要不是消耗太大,不建议这样写,毕竟创建自动释放池也是有消耗的