手动添加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] <NSObject: 0x28388b130>--<NSObject: 0x28388b130>
2018-09-11 22:20:07.323421+0800 QiFirstTasteOfAnimation[2285:483390] (null)--(null)
2018-09-11 22:20:07.323471+0800 QiFirstTasteOfAnimation[2285:483390] <NSObject: 0x28388b130>--<NSObject: 0x28388b130>
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] <NSObject: 0x604000010380>--<NSObject: 0x604000010380>
2018-09-12 09:12:25.706225+0800 QiFirstTasteOfAnimation[734:13206] (null)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容