2011-03-25 65 views
0
NSMutableArray *m_res = [NSMutableArray arrayWithCapacity:ticks]; 
double t = lo_t; 
while (t <= hi_t) { 
    [m_res addObject:[NSDecimalNumber decimalNumberWithDecimal: 
         [[NSNumber numberWithDouble:t] decimalValue] 
         ]]; 
    t += delta_t; 
} 

return [[NSArray arrayWithArray:m_res] retain]; 

它應該返回一個包含一些值的持久NSArray。當它不再需要時,我打算髮布它。是好的還是有一些錯誤,因爲當我調用包含此代碼的函數時,我的程序停止工作(這是一個內存問題,而不是無限循環)。它是否是內存安全的代碼?

+0

你可以給我們一個堆棧跟蹤,或告訴我們你得到什麼錯誤和在哪一行? – GoatInTheMachine 2011-03-25 11:12:29

回答

0

該代碼是安全(即不會崩潰),但最後一行是不正確的。 arrayWithArray沒有任何用處,保留是泄漏。

應該

return m_res; 

如果哈瓦崩潰的原因是在其他地方。

+1

同樣,從'arrayWithCapacity'返回的數組已經被自動釋放,你不需要自動釋放它。你也不應該用這種方法保留數組,因爲調用者有責任根據需要保留/釋放;在此方法中執行此操作可能會導致稍後泄漏,因爲調用者可能沒有意識到他們需要「釋放」實例。如果這是一個'init'方法,那看起來不是這個例外。 – GoatInTheMachine 2011-03-25 11:46:34

+0

嗯,你是對的,保留/ autorelease是不必要的,我已經刪除它,但它不是泄漏,呼叫者不需要釋放它。 – hooleyhoop 2011-03-25 12:05:37

+0

你已經修好了,但原來的**會泄露。隨着你不必要的保留/自動釋放,數組的保留計數爲3(inital autorelease,你的保留和退出時的autorelease每次都會增加保留數)。當autorelease池被清空時,它會自動釋放兩次,但這隻會使保留計數降低到1,所以這將是一次泄漏(除非調用者是新的他必須釋放它,在這種情況下,這將是不好的設計,保留的對象是釋放的響應對象,反之亦然)。 – GoatInTheMachine 2011-03-25 12:14:33