2012-10-20 45 views
0

我在創建一個測試應用程序時發生了一些崩潰,我非常肯定它來自內存管理。這裏有三個與此問題相關的問題:處理保留/釋放/自動釋放和類變量的問題

問題答:

// Within singleton : GraphicsUtility 
-(UIColor*)GetRandomColor 
{ 
    float l_fRandomRedColor = [[MathUtility instance] GetRandomFloatNumberBetweenNumber:0.0f AndNumber:1.0f]; 
    float l_fRandomBlueColor = [[MathUtility instance] GetRandomFloatNumberBetweenNumber:0.0f AndNumber:1.0f]; 
    float l_fRandomGreenColor = [[MathUtility instance] GetRandomFloatNumberBetweenNumber:0.0f AndNumber:1.0f]; 

    return [UIColor colorWithRed:l_fRandomRedColor 
        green: l_fRandomGreenColor 
         blue: l_fRandomBlueColor 
         alpha: 255]; 
} 

現在,我真的不知道該怎麼做才能返回一個指向該對象不重新發明輪子。由於方法colorWithRed:green:blue:alpha沒有分配或創建(新)任何東西,我不認爲我應該retain它。

我應該autorelease嗎?

問題B:

現在,在另一個類獲取對象時,是這樣的:

// Within class : Test. 
// mpCurrentPieceColor is a class variable. 
mpCurrentPieceColor = [[GraphicsUtility instance] GetRandomColor]; 

因爲我存儲一個指向UIColor對象,我需要再次保留它?

所以當改變我的顏色,我應該這樣做?

// Within class : Test. 
// mpCurrentPieceColor is a class variable. 
[mpCurrentPieceColor release]; 
mpCurrentPieceColor = [[GraphicsUtility instance] GetRandomColor]; 
[mpCurrentPieceColor retain]; 

似乎完全錯了,我...

問題C:

最後,在我的dealloc方法,我這樣做:

// Within class : Test 
-(void) dealloc 
{ 
    // never forget to call [super dealloc] 
    [super dealloc]; 

    [mpCurrentPieceColor release]; 
} 

這是對的嗎 ?

我發現的「最好」解決方案(也是更糟:))是在某些地方使用保留......我沒有崩潰了,但顯然,我最終發生了內存泄漏......任何幫助將不勝感激 !謝謝 ! A:不要autorelease。

回答

2

答:不要autorelease。你正在調用的方法返回一個自動釋放對象;你只是扮演傳遞角色。 C:這些看起來大多都可以。從邏輯上講,您的顏色釋放應該在[super dealloc]之前。

雖然我不太確定你的意思是「類變量」。在單身人士中,您可以使用mpCurrentPieceColor作爲強大(或保留)的財產,使用self.mpCurrentPieceColor訪問它,並且分配周圍的發佈/保留將消失。 (當然,如果切換到ARC,整個問題都會消失。)

另一點是「Product-> Analyze」菜單選項應該能夠標記出這種類型的問題。

+0

謝謝你的回答!我會放手一搏!我會及時通知你的! –

1

問題A和B有些令人困惑,因爲您沒有使用正確的方法名稱。 「get」在Cocoa中有着特殊的含義,很少使用。您可能只需要「randomColor」作爲名稱。它應該返回一個autoreleased對象,但colorWithRed:green:blue:alpha會這樣做,除了看起來不錯的名字外。

假設您要返回一個自動釋放對象,您需要保留結果並在完成後釋放它。

你的dealloc絕對不對。 [超級dealloc]將完成摧毀對象。之後您不能再使用對象的部分(mpCurrentPieceColor)。你應該總是最後調用[super dealloc],因爲這是銷燬對象的最後一步。

+0

非常感謝!我會放手一搏! –