美文网首页
手动添加autoreleasepool

手动添加autoreleasepool

作者: Lucky_Man | 来源:发表于2018-09-11 22:36 被阅读0次

    手动加入自动释放池块(@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)
    

    相关文章

      网友评论

          本文标题:手动添加autoreleasepool

          本文链接:https://www.haomeiwen.com/subject/juepgftx.html