2010-06-09 113 views
0

我很抱歉問這樣一個簡單的問題,但這是一個我無法找到答案的具體問題。iPhone上的內存管理

我不是原生的Objective-C程序員,所以我很抱歉如果我使用任何C#術語!

如果我在test.h

@interface test : something { 
    NSString *_testString; 
} 

定義一個對象,然後初始化它test.m

-(id)init { 
    _testString = [[NSString alloc] initWithString:@"hello"]; 
} 

後來我明白,我會釋放它的dealloc中,因爲每個INIT應該有一個版本

-(void)dealloc { 
    [_testString release]; 
} 

但是,我需要澄清的是如果在init中會發生什麼,我使用其中的一個e創建對象的快捷方法,我仍然在dealloc中釋放它嗎?這不會打破「一個初始化的一個版本」規則嗎?例如

-(id)init { 
    _testString = [NSString stringWithString:@"hello"]; 
} 

回答

1

如果你設定一個自動的屬性,該屬性的對象可以隨時死去超越眼前的範圍。便捷方法,即以類型:字符串,數組,字典等開頭的方法返回自動釋放對象。當你不關心它們是否超過目前的範圍時,你只能使用自動釋放的對象。

在這種情況下,您真正​​需要做的是使用訪問器(合成或自定義)來自動管理您的保留。

如果你這樣做:

@property(nonatomic, retain) NSString *_testString; // .h 
@synthesize _testString; //.m 

然後在代碼中使用的參考形式:

self._testString = [NSString stringWithString:@"hello"]; 

...那麼你必須釋放_testString的唯一地方是在dealloc中。編譯器將創建合成存取器,它將自動爲您管理屬性存儲器。

順便說一句,你不應該使用下劃線的名字。蘋果公司保留了自己的名字,所以你可以得到命名衝突。

3

如果它不是用alloc,new,copy,mutableCopy創建的,那麼你不負責釋放它。

This網站有一些很好的內存管理快速概述。

下面是引自cocoadevcentral:

如果您創建使用 手冊頁頭樣式的對象,以後需要 釋放對象。您應該 不會手動發佈自動發佈的 對象,因爲如果您這樣做,您的應用程序將崩潰 。

0

該規則是如果您創建一個新的,分配,複製或保留它的對象,你需要釋放它。不得以任何其他方式創建對象。

因此,在您的具體情況下,您不需要釋放使用stringWithString創建的字符串。

順便說一句,我會推薦Cocoa and Objective-C: Up and Running書來了解更多關於這樣的事情。如果您是Cocoa編程的新手,那麼介紹一下。

+0

規則是,如果您使用** new ** alloc或copy **創建對象,或者您保留它**,則需要將其釋放。以任何其他方式創建的對象**不得被釋放。修復它爲你。 – JeremyP 2010-06-09 15:32:17

+0

謝謝。我在你的說明中進行了編輯。 – jcady 2010-06-09 18:08:29

0

在示例的第一部分中,您確實必須在某處爲字符串提供發佈。

在示例的第二部分,因爲它的自動釋放,您不需要在dealloc方法中調用額外的版本。這實際上導致你正試圖將消息發送到的東西,不再存在崩潰......

6

有一個精緻的縮寫,記住你有什麼釋放

NARC - 新的,分配,保留,複製。

+0

不錯,我忘記了那個可愛的小首字母縮略詞:) – Justin 2010-06-09 14:39:26

2

只是爲了澄清一些事情。當你通過N.A.R.C獲得一個物體時因爲sylvanaar說你確實需要release它。在其他情況下,您將獲得一個自動釋放的對象,稍後將自動釋放該對象。這在你提供的代碼中會很糟糕,因爲你確實希望這個字符串至少和你的對象一樣長。所以你實際上需要做一個明確的retain來保持它對象的活性。

沒有直接回答你的問題,而是期待下一個;-)

0

相反,您需要保留您從stringWithString:獲得的對象。正如您正確指出的那樣,您不擁有該對象,因此不需要釋放它。但是因爲你不擁有它,所以隨時都可以自由消失,如果你幸運的話會讓你崩潰(如果你不幸的話,它會是一個非常奇怪的錯誤)。所以你需要保留這個對象,然後你需要釋放它在dealloc

所有這些在memory management guide中都有很好的解釋。我建議你多讀幾遍。這不是很長或很難,一旦你內化它,你永遠不會再想。