自動参照カウントARC

2202 ワード

ARC ARCはiOS 5が発売した新しい機能で、ARC(Automatic Reference Counting)と呼ばれています.簡単に言えば、コードにretain/releaseが自動的に追加され、メモリ管理の参照カウントを処理するために手動で追加する必要があったコードがコンパイラによって自動的に完了する.
---ARC管理*OCオブジェクトポインタ*blockポインタ*で使用されるオブジェクトattribute(NSObject)定義typedef
---ARC管理*値タイプ*他の方法で割り当てられたヒープオブジェクト*参照カウント管理を受けないオブジェクト
1)参照タイプオブジェクトを新規作成(alloc,new,copyを使用)し、参照カウント+12)オブジェクト参照カウント増加+1---retain操作オブジェクト参照を他の変数または定数に割り当てたときにオブジェクト参照を他の属性に割り当てたり、インスタンス変数を関数パラメータに渡したり、値を返してオブジェクトを集合に追加したりする3)オブジェクト参照カウント減少-1ローカル変数またはグローバル変数をnilまたは他の値に割り当てて属性をNilまたは他の値インスタンス属性に割り当てたオブジェクトパラメータの解放またはローカル変数が関数から離れてオブジェクトをコレクションから削除する4)参照カウントが0の場合、メモリは自動的に解放されます.
retain,release,autorelease,deallocはコンパイラによって自動的に挿入され,コードでdeallocを呼び出すことはできないリロードできるが[super dealloc]を呼び出すことはできない.
void arcDemo(){
    
    BLNPoint *p1 = [[BLNPoint alloc]init];
    
    BLNRectangle *rect = [[BLNRectangle alloc]init];
    
    //  ---------------      retain +1 
    
    BLNPoint *p2 = p1;//r(2)
    rect.center = p1;//r(3)
    draw(p1);
    array=[[NSMutableArray alloc]initWithCapacity:10];
    [array addObject:p1];//r(4)
    
    //  ---------------      release -1 
    p1 = nil;//r(3)
    p2 = nil;//r(2)
    rect.center = nil;//r(1)

    [array removeObjectAtIndex:0];//r(0)
    
    NSLog(@"continue......");
}

リファレンスhttp://blog.csdn.net/likendsl/article/details/10900469
自動リリースプール(autoreleasepool)*releaseは、オブジェクトをすぐに解放します.オブジェクトを頻繁にreleaseすると、こまごましたメモリ管理の負担になる可能性があります.aotorreleaseは、releaseの呼び出しを自動リリースプールが解放されるまで遅らせることができます.*自動リリースプールBLockを使用することをお勧めします.終了すると、autoreleaseメッセージを受信したすべてのオブジェクトがすぐにリリースされます.*AppKitフレームワークとUImitフレームワークは、イベントのループ反復を処理するたびに、AutoRelease Poolに挿入されます.ほとんどの場合、無秩序なプログラマーが介入します.
// 
void poolDemo(){
    
    @autoreleasepool {
        for (int i = 0; i < 10; i++) {
            __unused  BLNRectangle *rect = [[BLNRectangle alloc]init];
            
        }
    }
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        NSLog(@"-------ARC Demo: ----------");
        arcDemo();
        
        NSLog(@"-------Autorelease Pool Demo: ----------");
        
        poolDemo();
       
    }
    return 0;
}