2011-10-26 132 views
0

示例代碼:釋放返回的對象還是我必須使用自動釋放

- (Foo*)createFoo { 
    Foo *foo = [[Foo alloc] init]; 
    return foo; 
} 

- (void)someOtherMethod { 
    Foo *foo; 
    foo = [self createFoo]; //retain count 1 
    [foo release]; //retain count = 0 => object gets released? 

    //repeat 
    foo = [self createFoo]; 
    [foo release]; 
} 

Qeustion(可能是愚蠢的一個):我必須在createFoo自動釋放或者我可以釋放someOtherMethod返回的對象?

+0

我想你正在調用[self createFoo]而不是[self Foo],然後可以在其他方法中釋放它。請記住,ARC可以讓你擺脫幾乎所有的問題...... –

+1

@ilMalvagioDottorProsciutto雖然我同意ARC的評論,但我認爲應該如何手動完成它是很好的,除了ARC只是把這些調用無論如何,知道它在做什麼是非常好的。 –

+0

@SimonLee完全是我的想法 – peko

回答

0

當您將所有權移交給調用代碼時,此實例中的代碼應該自動釋放您的對象,您不再希望在方法內負責,因此您應該放棄對其的保留。

記住NARC - 與這些關鍵字開始被假定爲不自動釋放方法...

新,分配,保留,複製

如果你的方法被命名爲newFoocopyFoo那麼你的代碼上面會罰款沒有autoreleasing。

+0

所以沒有什麼會出錯,如果將app的代碼要求重命名爲newFoo的createFoo? – peko

+0

是的,這很好,否則自動釋放,然後將其保留在調用代碼中,並在完成時釋放。 –

0

可可內存管理其實很簡單,因爲每個人都堅持一套規則。你沒有遵循這些規則,所以你會遇到麻煩。

閱讀Basic Memory Management Rules。如果你堅持遵守這些規則,你應該沒問題。

相關問題