autoreleasepool的使用

自动释放池管理

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把循环体括起来,可以降低内存

你可能感兴趣的:(autoreleasepool的使用)