iOS @autoreleasepool在for循环中的作用

首先:

创建一个新工程,appdelegate里只写下面的代码。一个for循环,循环里构建一个字符串,然后打印该字符串。如果为了效果显著 ,自行增大循环次数。

    for (int i = 0; i < 1000000; i++) {
        NSString *str = [NSString stringWithFormat:@"hello -%04d", i];
        NSLog(@"%@",str);
    }

从xcode自带的内存占用工具可看出:内存值呈递增态势。当程序运行到20万次的时候,内存峰值18兆左右。

想象一下,如果for循环中的任务繁重,内存占用会相当大。

iOS @autoreleasepool在for循环中的作用_第1张图片

然后:

看下面的代码,唯一区别是加了autoreleasepool:

    for (int i = 0; i < 1000000; i++) {
        @autoreleasepool {
            NSString *str = [NSString stringWithFormat:@"hello -%04d", i];
            NSLog(@"%@",str);
        }
    }

运行后,可以看出,内存平稳在8.7兆左右。这就是autoreleasepool的在for循环中的作用。

别走!!!

继续看下一步!!!

 

iOS @autoreleasepool在for循环中的作用_第2张图片

下一步:

看下面的代码,不用猜也知道内存肯定会暴增,但这时候加上@autoreleasepool有意义吗?

有些人认为加上没意义,他们认为array数组持有str,str没有释放,所以加上没意义。

    NSMutableArray *array = [NSMutableArray array];
    for (int i = 0; i < 10000000; i++) {
        NSString *str = [NSString stringWithFormat:@"hello -%04d", i];
        [array addObject:str];
    }

我表示怀疑,run一下,不贴图,直接报数值了。

循环次数为100万次时,内存峰值在70兆左右,循环结束后,回落值在34兆左右,没有其他代码,程序会保持34兆这个内存值平稳运行下去。

循环次数为1000万次时,内存峰值在600兆左右,循环结束后,回落值在39兆左右,没有其他代码,程序会保持39兆这个内存值平稳运行下去。

然后,对比上面的代码,加上@autoreleasepool。

   NSMutableArray *array = [NSMutableArray array];
    for (int i = 0; i < 10000000; i++) {
        @autoreleasepool {
            NSString *str = [NSString stringWithFormat:@"hello -%04d", i];
            [array addObject:str];
        }
    }

再来run一下,可以看出:

循环次数为100万次时,内存峰值在55兆左右,循环结束后,回落值在19兆左右,没有其他代码,程序会保持19兆这个内存值平稳运行下去。

循环次数为1000万次时,内存峰值在400兆左右,循环结束后,回落值在19兆左右,没有其他代码,程序会保持19兆这个内存值平稳运行下去。

所以,加不加看你心情,当然循环100万次、1000万次的场景并不多,但就技术而言,1就是1,2就是2,我们拿数据说话。

 

 

 

 

你可能感兴趣的:(iOS,开发)