手动添加autoreleasepool

手动加入自动释放池块(@autoreleasepool),可以使得占用堆空间的临时变量得以更早的回收。

考虑点:

  • weak 修饰的对象 不增加引用计数;
  • [NSObject new] 的时候会开辟堆空间。

写了个小例子如下:

/**
 @brief 手动添加autoreleasepool测试
 */
- (void)manualAddAutoreleasePooTest {
    
    __weak NSObject *weakObj;
    NSObject *obj1 = [NSObject new];
    weakObj = obj1;
    NSLog(@"%@--%@", obj1, weakObj);
    obj1 = nil;
    NSLog(@"%@--%@", obj1, weakObj);
    
    @autoreleasepool{
        NSObject *obj2 = [NSObject new];
        weakObj = obj2;
        NSLog(@"%@--%@", obj2, weakObj);
    }
    NSLog(@"%@", weakObj);
}

输出结果如下:

 Xcode9.4.1 在iPhoneX模拟器及真机12.0(16A5366a)都是这个结果

2018-09-11 22:20:07.323334+0800 QiFirstTasteOfAnimation[2285:483390] --
2018-09-11 22:20:07.323421+0800 QiFirstTasteOfAnimation[2285:483390] (null)--(null)
2018-09-11 22:20:07.323471+0800 QiFirstTasteOfAnimation[2285:483390] --
2018-09-11 22:20:07.323488+0800 QiFirstTasteOfAnimation[2285:483390] (null)

一个局部变量对于另一个局部变量有引用关系的情况

可以考虑使用多层的autoreleasepool嵌套的情况,这样内部的autoreleasepool中,没有受到内层autoreleasepool外的变量引用的临时变量的内存可以及时得到回收。并且使得整个外层autoreleasepool中的数组中添加临时变量部分的内存也得以及时回收。

    @autoreleasepool{
        NSMutableArray *arrM = [NSMutableArray array];
        @autoreleasepool{
            NSObject *obj2 = [NSObject new];
            [arrM addObject:obj2];
            weakObj = obj2;
            NSLog(@"%@--%@", obj2, weakObj);
        }
    }
    NSLog(@"%@", weakObj);

输出结果如下:

 Xcode9.4.1 在iPhoneX模拟器及真机12.0(16A5366a)都是这个结果

2018-09-12 09:12:25.706127+0800 QiFirstTasteOfAnimation[734:13206] --
2018-09-12 09:12:25.706225+0800 QiFirstTasteOfAnimation[734:13206] (null)

你可能感兴趣的:(手动添加autoreleasepool)