iOS內存管理總結

1、理解引用計數

對象的生命週期以下:函數

一、生成並本身持有對象 引用計數+1 code

使用alloc、new、copy、mutableCopy名稱開頭的方法,意味着本身生成的對象本身也持有。orm

但不是絕對的,以下對象

NSObject *object= [NSObject new];//retainCount=1

NSArray *object= [NSArray new];//retainCount=-1

二、持有對象(retain) 引用計數+1生命週期

三、釋放對象(release) 引用計數-1it

四、廢棄對象 (alloc)table

上面的描述用代碼表示就清楚了,以下:test

NSObject*object = [NSObject new];//1

[object retain];//2

NSLog(@"%d ", object.retainCount);

[object release];//1

NSLog(@"%d ", object.retainCount);

[object release];// 0

//[object release];

2、自動釋放池

對象持有引用計數+1,釋放引用計數-1,當引用計數=0時,對象釋放。貌似很簡單,一兩句話就能夠歸納清楚。可是當多個實體擁有某個對象時,對象的全部權就變得複雜了。object

- (NSString*)myString
    {
        NSString *str = [[NSString alloc] initWithFormat:@"test"];
        [str retain];
        return str;
    }

像這種狀況,究竟誰釋放?
若是在myString裏面釋放。那麼myString函數外面就無法使用對象了,由於已經被釋放了。
那如何是函數外面釋放,意味着調用者要負責處理。這樣一來,有點不方便。
因此這時候應該用自動釋放(autorelease)來釋放對象:引用

- (NSString*)myString
{
    NSString *str = [[NSString alloc] initWithFormat:@"test"];
    [str autorelease];
    return str;
}
相關文章
相關標籤/搜索