1. 程式人生 > >Objective-C 內存管理retain和release

Objective-C 內存管理retain和release

計數 nco 優雅 tracking con void sep res 釋放資源

OC使用引用計數來管理內存,每個繼承NSObject的對象,內部都維護了一個引用計數器retainCount。當對象創建時(調用alloc或者new)引用計數器會+1, 手動調用retain()方法能夠使引用計數器+1。手動調用release()方法能夠使引用計數器-1,當引用計數器為0時,對象會自己主動調用"析構函數" dealloc()方法來回收資源和釋放內存。

這樣當一個對象被多個地方使用和管理時,能夠通過retain()將引用計數器+1,來獲取使用權限(防止其它使用者釋放該對象)。用完了之後再通過調用release()將引用計數器-1來放棄使用權限(此時假設引用計數器為0,說明沒有其它地方再使用該對象了。直接會被釋放。假設引用計數器不為0,則證明還有其它地方再使用這個對象,該對象不會被釋放)。

這是一種設計很優雅的內存管理機制,誰使用誰retain()用完之後release(),假設已經沒有人使用它了。引用計數器為0,則釋放掉。

//
//  Goods.h
//  08_Retain&&Release
//
//  Created by apple on 14-11-12.
//  Copyright (c) 2014年 cc. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Goods : NSObject

@property int price;


/**
 *  dealloc方法,對象釋放時會調用。用於資源的回收,相當於C++中的析構函數
 *  dealloc方法須要重寫父類的方法,實現釋放當前類的資源
 */
- (void)dealloc;

@end

//
//  Goods.m
//  08_Retain&&Release
//
//  Created by apple on 14-11-12.
//  Copyright (c) 2014年 cc. All rights reserved.
//

#import "Goods.h"

@implementation Goods

- (void)dealloc {
    
    //TODO: 釋放資源碼
    
    NSLog(@"[email protected]", self);

    //須要調用父類來釋放對象
    [super dealloc];
}

@end

//
//  main.m
//  08_Retain&&Release
//
//  Created by apple on 14-11-12.
//  Copyright (c) 2014年 cc. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Goods.h"

int main(int argc, const char * argv[]) {

    @autoreleasepool {
    
        //當調用alloc或者new創建一個OC對象時,引用計數+1
        Goods* pGoods = [[Goods alloc] init];
        //輸出: 1
        NSLog(@"retainCount=%lu", (unsigned long)[pGoods retainCount]);
        
        //調用retain時引用計數+1
        [pGoods retain];
        //輸出: 2
        NSLog(@"retainCount=%lu", (unsigned long)[pGoods retainCount]);

        //調用release時引用計數-1
        [pGoods release];
        //輸出: 1
        NSLog(@"retainCount=%lu", (unsigned long)[pGoods retainCount]);

        //調用release時引用計數-1,此時retainCount為0。內存將被釋放。自己主動調用realloc來釋放資源和內存
        [pGoods release];
        
    }
    return 0;
    
}


Objective-C 內存管理retain和release