2013-09-23 201 views
0

不使用ARC OR自動垃圾收集內存管理

 -(Fraction*) add: (Fraction*) f 
     { 
      Fraction *result = [[Fraction alloc] init]; 
      //To do 

      return result; 
     } 

    //after the function returns. What will the reference count 
of object that result was pointing to. See main.m below. 

IN的main.m

int main(int argc, char* argv[]) 
    { 
     //To do 

     Fraction *ans = [[Fraction alloc] init]; 



     ans = [f1 add: f2]; 
     //I guess that the refrence count of the object that ans will be pointing 
after this statement will be 1 or 2. 
     //... 

    } 

//從斯蒂芬科昌目標c關於此的提取物

使用手動內存管理時,此方法存在問題。在計算完成後,結果對象被分配並從方法返回。因爲該方法必須返回該對象,所以它不能釋放它 - 這會導致它立即被銷燬。解決此問題的最佳方法可能是自動釋放對象,以便可以返回其值,同時釋放該對象直到自動釋放池被耗盡。你可以採取的事實,即自動釋放方法返回其接收器並將其嵌入表達這樣的優勢:

Fraction *result = [[[Fraction alloc] init] autorelease]; 
//or like this: 
return [result autorelease]; 

注:根據提取似乎refrence計數爲2。如果它是這樣,請解釋一下爲什麼?

+0

目標C中的內存管理有很多很多類似的問題。請參見[Objective-C中的內存管理](http://stackoverflow.com/questions/2020103/memory-management- in-objective-c)爲例。 –

回答

0

//答案不承擔任何ARC和自動垃圾收集

在附加功能: 分數類的一個瞬間被創建並對它的引用存儲在result。因爲alloc and init用於創建那個時刻result成爲它的所有者。只有擁有者必須在使用完成時釋放它擁有的對象。但result不會釋放它(See add)。現在,add返回對由result擁有的對象的引用,並將其存儲在ansmain.m中。因爲,ans不是它所引用的對象的所有者,也沒有進行任何獲取的嘗試,所以對象的引用計數爲1.因爲此對象的所有者不能再被引用所以,我們不能釋放它。 (Blah!內存泄漏)。
但是,如果我們做[ans release]。雖然這是不好的做法。它可以節省內存泄漏...
我想是的。請評論它是否不會

+0

@CarlVeazey我希望得到這樣的答案。如果我錯了,請糾正我。 – aMother