2013-11-05 93 views
0

即使我們不擁有ivar的(alloc/new/copy),我們是否必須在dealloc中釋放ivar?即使我們不擁有伊娃的(alloc/new/copy),我們是否必須在dealloc中釋放伊娃?

例如,這是正確的嗎?

-(void)dealloc { 
    [_aUIImageIvar release]; 

    [super dealloc]; 
} 

-(id)init{ 
    self = [super init]; 
    if (self) { 
     _aUIImageIvar = [UIImage imageWithData:data]; 
    } 
} 
+7

不可以。不要釋放你不擁有的東西。但爲什麼你不保留這個形象? – rmaddy

+0

謝謝@rmaddy,我忘了保留它...因爲我沒有使用setter,所以很容易忘記保留。 – Cong

+0

簡單的規則,如保留 - 釋放配對容易與其他事物混淆... – Cong

回答

1

不,你應該只有release那些你保留(或者擁有)的物品。但是創建一個autorelease對象並沒有任何意義,它會保留它,因爲當池被耗盡時它會被釋放。

考慮您的線路:

_aUIImageIvar = [UIImage imageWithData:data]; 

返回一個自動釋放的對象,正如你指出的,因爲你不擁有它(例如,你不retain或用創建alloc/init) ,當autorelease池被耗盡時(也就是在你使用它之前)它會被釋放,並且你最終會得到一個指向釋放對象的懸掛指針。

很明顯,你可以通過添加retain解決這個問題,但它會更合乎邏輯與alloc/init創建:

_aUIImageIvar = [[UIImage alloc] initWithData:data]; 

然後你會得到一個的retainCount一個對象,它將保留給你(然後你的方法將是正確的)。但是創建一個自動釋放對象的構造,並沒有對它做任何事情,這是沒有意義的。

+0

對於@Rob,其實我已經使用了屬性'_profileImage',所以我可以使用'[self setProfileImage:[UIImage imageWithData:data] ];'隱式保留它。 – Cong

+0

但是'_aUIImageIvar = [[UIImage alloc] initWithData:data];'如果不使用setter則更符合邏輯。 – Cong

+0

@congliu在這種情況下,只需在'dealloc'中刪除'release'就可以了。當'profileImage'被釋放時(你沒有向我們顯示,但我假設你釋放了這個),這將減少這個圖像的保留計數。 – Rob

4

不,實際上你不能釋放它。奇怪的是,你不保留它在你的構造函數中。另外,除非你有充分的理由不這樣做,否則你應該轉向使用ARC。