2009-06-13 93 views
4

這是我寫的一些代碼的要點。我擔心我沒有正確解決NSMutableArray上數組類方法的保留/釋放問題。以下內容是否真的在泄漏內存?可可觸摸問題。應該保留[NSMutableArray數組]嗎?

for(a while) { 
    // do stuff 
    NSMutableArray *a = nil; 
    // do stuff 
    if (!a) { 
     a = [NSMutableArray array]; 
    } 
} // for(a while) 

回答

12

你不會泄露這個代碼的內存,並釋放自己的數組中會導致崩潰時,陣列在運行循環結束時自動釋放。

大多數可可類提供了幾個製作一個新的對象的方式,並與本公約非常一致:

  1. [[NSSomeObject alloc] init]:你是負責釋放對象(實例方法)。

  2. [NSSomeObject someObject]:對象將自動釋放給你,通常在運行循環的末尾(類方法)。這大致相當於[[[NSSomeObject alloc] init] autorelease]

正確使用的實例方法是:

a = [[NSMutableArray alloc] init]; 
// do stuff 
[a release]; 

正確使用類方法是:

a = [NSMutableArray array]; 
// do stuff, array is in the autorelease pool 

注意,蘋果建議你遠離儘可能方便的方法來提高性能。這是controversial advice,可能不會節省太多的處理器時間,並且將alloc-init從發佈版本中分離出來,您可能實際上並不太關心保留的對象。

+0

優秀的答案。非常感謝。 – dugla 2009-06-13 17:17:16

6

Cocoa Memory Managment Rules

如果使用名稱以「黃金」或「新」,或包含「複製」(例如一個方法來創建它你需要一個對象的所有權, alloc,newObject或mutableCopy),或者如果您發送一個保留消息。您有責任放棄使用發行版或自動發行版所擁有的對象的所有權。任何其他時間你收到一個對象,你不能釋放它。

因此與線:

a = [NSMutableArray array]; 

你不採取數組的所有權,它會被傳遞給你自動釋放。內存將由autorelease池自動處理,一旦它不再被使用,它會爲你釋放。但是,如果要將數組保留在當前事件之外,則必須保留該數組,否則它將爲您釋放。

2

是的,如果你想要它堅持下去。

返回的對象是一個autoreleased對象,當它的autorelease池被清除時它將被釋放。

所有以「array」開頭的數組類方法返回這些類型的自動釋放對象。

閱讀本doc蘋果

0

這是有效的。當你有問題時,手動管理可能有助於學習。

有一個約定:

  • 初始化前綴(INIT,initWithString :)表示爲1的保留計數,其中
  • 對象名的前綴(字符串,stringWithString :)表示一個自動釋放物體

多年來,我一直習慣於在通話網站發佈我所能做的事情,而不是將其推向自動發佈。一些autorelease問題,然後變得很難追查。當然,在這種情況下,autorelease對程序員來說是一種方便(沒有任何錯誤),但是會對重用,清晰度和性能產生負面影響(在大型代碼庫/程序中更是如此)。