2011-05-26 73 views
3

我正在通過Stephen Kochan的Objective-C編程(這是承認我是一個完整的初學者)。目標C中的泄漏方法

我目前的程序是一個小數計算器。我有加法,減法,乘法和除法。 (只有一點點,但它是一個小程序)儀器告訴我,他們都在漏水

這裏的扣除法的定義(其餘遵循一個非常類似的形式):

-(Fraction *) subtract: (Fraction *) f; 
{ 
    Fraction *result = [[Fraction alloc] init]; 
    int   resultNum, resultDenom; 

    resultNum = numerator * f.denominator - f.numerator * denominator; 
    resultDenom = denominator * f.denominator; 

    [result setTo: resultNum over: resultDenom]; 

    return result; 
    [result release]; 
} 

思考堵塞泄漏?提前致謝。

此外,我在網站上尋找另一個解釋,但不幸的是,我不認爲其他任何人問過這麼基本的東西。

+0

可可約定說,返回自動釋放必須以'new'開頭的名稱已alloced並沒有解除對象/任何方法或「創造」。否則,如果它返回一個對象,它應該按照Bavarious的回答'autorelease'd。 – 2011-05-26 06:10:20

回答

8

的問題是:因爲不執行return後的任何陳述

return result; 
[result release]; 

-release永遠不會發送到result。這種說法被稱爲死代碼。

你應該自動釋放你的對象,例如:

return [result autorelease]; 

請注意,您應該使用-autorelease代替-release因爲-release會導致result立即釋放,這是不是你想要的。另一方面,一個自動釋放的對象將在未來某個時候釋放 - 具體來說,當相應的自動釋放池被耗盡時。

+2

回答「那麼,相應的自動釋放池何時耗盡?」:在大多數情況下,這將是AppKit/UIKit框架在每次運行開始時創建的頂級自動釋放池事件循環並在最後流失。 – Chuck 2011-05-26 06:37:17

+0

@Chuck,@Bavarious,@Shaggy Frog感謝您的幫助,以及關於release v。autorelease和一般編程約定的額外信息。我現在要試一試。 (另外,我對這個網站上的回覆印象非常深刻,並期待着我可能真正貢獻的一天,而不僅僅是水蛭。) – ctaggart 2011-05-26 13:21:50

4

替換:

return result; 
[result release]; 

有了:

return [result autorelease];