手動でautoreleasepoolを追加

1967 ワード

自動解放プールブロック(@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)
    

    1つのローカル変数が別のローカル変数に対して参照関係がある場合


    多層の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)