2010-02-17 42 views
4

在objective-c中,我明白你需要釋放任何你初始化/保留/複製的東西。我需要在return聲明之前這麼做嗎?我想明白明確地撥打release而不是使用autorelease在返回之前釋放局部變量?

-(void) someMethod 
{ 
    AnotherClass* ac = [[AnotherClass alloc] init]; 
    if([ac somethingHappens]){ 
    // Do I need to release ac here? 
    return; 
    } 
    [ac doSomethingElse]; 
    [ac release]; 
} 

謝謝!

+0

在上面的代碼中有多個返回路由是不好的做法,一個是顯式的,一個是隱式的。你應該將返回移動到[release]下面,想象很多if()語句,每個語句都返回,這是很多重複的代碼。 – 2010-02-17 21:45:24

+0

爲什麼它是不好的做法,因爲它很難遵循?看起來好像跟着一堆,如果邏輯可能同樣複雜。 – 2010-02-17 23:02:32

+0

當你有30個地方需要複製並且超過一個發佈代碼塊時,並且當你添加一個需要[發佈]的東西時,你現在必須更新30個地方。它違反了DRY本人(不要重複自己)。 如果你有一個返回值,最好的做法是在邏輯中設置返回值,然後在函數的底部返回該值,就在你的[release]塊單點之後。 – 2010-02-18 20:47:38

回答

3

是的,你需要釋放你的變量,但是你退出該方法。

這非常直截了當:當你初始化一些東西時,保留計數會增加。當你釋放它減少。當它達到零時,它會自動釋放(釋放)。

在上面的代碼中,您初始化變量,但如果它遵循返回路由,那麼變量保留計數永遠不會變爲零,因此永遠不會被釋放。

+0

實際上,並不是當你初始化一些東西,而是當你分配一些東西的時候。如果你的'init'方法沒有調用'[super init]',那麼保留計數仍然是1. – dreamlax 2010-02-17 20:29:30

+0

哦!這是很好的知道。我已經編輯過我的帖子。 – 2010-02-17 20:55:06

+0

@Stephen,謝謝,這就是我需要知道的。我現在也瞭解得更清楚了。 – 2010-02-17 20:55:49

2

假設有分配像下面

NSString *placeHolder = [NSString stringWithFormat:@"%@ %@",[someObject value1], [someObject value2]]; 

現在一個局部變量這個變量傳遞給一個對象中定義的方法,例如的UISearchBar對象的setPlaceholder

[self.theSearchBar setPlaceholder:placeHolder]; 

如何在正確的釋放方式分配的字符串'placeHolder'?

如果你想給autoreleas它:

NSString *placeHolder = [[NSString stringWithFormat:@"%@ %@",[someObject value1], [someObject value2]] autorelease]; 

代碼如果你想釋放傳遞到其他地方後,可變像

[self.theSearchBar setPlaceholder:placeHolder]; 
[placeHolder release]; 

一個將失敗,bad_exc_access

運行時異常也會拋出。

那麼,怎麼了?

問題是保留計數。該對象的UISearchBar分配還,所以如果你釋放或自動釋放這樣一個變量,這個對象指,保留計數還是一樣

NSLog(@"Retain count before assign to refer other object %d", [placeHolder retainCount]); 
[self.theSearchBar setPlaceholder:placeHolder]; 
NSLog(@"Retain count after referencing %d", [placeHolder retainCount]); 

那麼,該如何處理呢?

嘗試像下面

[placeHolder retain]; // retainCount +1 
[self.theSearchBar setPlaceholder:placeHolder]; 
[placeHolder release]; // retainCount -1 

我們做什麼能比?讓我們來看看保留計數現在

NSLog(@"Retain count before doing retain %d", [placeHolder retainCount]); 
[placeHolder retain]; // retainCount +1 
NSLog(@"Retain count after retaining it %d", [placeHolder retainCount]); 

所以,我們遞增保留計數之前爲它分配(得到由參考)一些對象, - 後 - 我們釋放本地是可變的。

就是這樣。

+0

很好的解釋。 – HotFudgeSunday 2012-05-31 18:36:48

相關問題