ios已经有了ARC机制为什么还保留autoreleasepool,autoreleasepool在什么情况下使用呢?
根据苹果官方文档中,下面三种情况下是需要我们手动添加 autoreleasepool 的:
1、如果你编写的程序不是基于 UI 框架的,比如说命令行工具;
2、如果你编写的循环中创建了大量的临时对象;
3、如果你创建了一个辅助线程。
看下面的例子,主要针对第二种情况,观察内存情况
首先是一个 获取本机内存的方法
double getMemoryUsage(void) {
struct task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
kern_return_t kerr = task_info(mach_task_self_, TASK_BASIC_INFO, (task_info_t)&info, &size);
double memoryUsageInMB = kerr == KERN_SUCCESS ? (info.resident_size / 1024.0 / 1024.0) : 0.0;
return memoryUsageInMB;
}
2、对比查看加上autoreleasepool和不添加内存情况
- (void)test{
int lagerNum = 2000000;
for (int i = 0; i < lagerNum; i++) {
NSNumber *num = [NSNumber numberWithInt:i];
NSString *str = [NSString stringWithFormat:@"%d ", i];
[NSString stringWithFormat:@"%@%@", num, str];
if (i == lagerNum - 5) { // 获取到快结束时候的内存
float memory = getMemoryUsage();
NSLog(@" 内存 --- %f",memory);
// 内存 --- 144.777344M
}
}
for (int i = 0; i < lagerNum; i++) {
@autoreleasepool {
NSNumber *num = [NSNumber numberWithInt:i];
NSString *str = [NSString stringWithFormat:@"%d ", i];
[NSString stringWithFormat:@"%@%@", num, str];
if (i == lagerNum - 5) { // 获取到快结束时候的内存
float memory = getMemoryUsage();
NSLog(@" 内存 --- %f",memory);
// 内存 --- 38.265625M
}
}
}
}
从上面例子可以看出当在for循环中创建大量的临时变量时,会使增加内存,只有在退出for循环的时候临时变量才会清楚,没有退出循环的时候内存一直很高,这种情况可以使用autoreleasepool把循环体括起来,可以降低内存