2010-07-22 37 views
1

這可能是一個更多關於對象alloc/retain/release的問題,但我將以NSString爲例。我知道,我可以這樣做:obj-c NSString和alloc/retain/release

NSString* myString = [[NSString alloc] initWithString:@"Test"]; 

基本上分配和初始化由我mystring變量引用一個字符串,我應該再打[myString的發行]在。但是,如果我這樣做之後,我把它設置爲其他字符串,如:

myString = someOtherString; 

做,基本上創建一個內存泄漏,因爲我已經重新分配我的指針到另一個對象,失去了所有參照原我分配了?

如果我只是想親自分配和釋放一個字符串,然後在不同時間更改它的值,我應該使用不同於'='的語法,或者是被重載的正確更改對象內容當我使用=時,最初由myString表示。

回答

4

是的,在你的例子中,你正在泄漏內存。

NSString* myString = [[NSString alloc] initWithString:@"Test"]; 
myString = someOtherString; 

你應該這樣做,像這樣:

NSString* myString = [[NSString alloc] initWithString:@"Test"]; 
[myString release]; 
myString = someOtherString; 

我聽到整個的最好辦法留住描述/釋放的是想像你是走的人狗。你的「物體」是一隻狗,「保留」將一隻狗帶在狗身上,「釋放」帶走一根繩子。你可以根據自己的需要在狗身上安裝任意數量的皮帶,但是你希望至少有一條皮帶扣在狗身上,這樣他就不會自由奔跑(泄漏),並且一旦把它拿回來就想從狗身上取下所有的皮帶給所有者(你想擺脫對象)。在你的例子中,你可以把它想象成放開狗的中間步行,並撿起另一隻狗的皮帶。

+0

沒錯,內存泄漏就像你的狗走路的客戶乾涸,隨着字的傳播,你不斷失去人的狗。 – jasongetsdown 2010-07-22 20:23:01

+0

我認爲你的比喻有點短,因爲如果一個「皮帶」就像一個參考數字,而只有一隻狗「跑掉」,如果它的領子上沒有皮帶,那麼我的例子就是不會拿起皮帶不同的狗,放下我的皮帶,轉而看另一隻狗。聽起來像一個更正確的比喻將是沒有持有牽引繩,以增加連接到燈柱或去除他們等皮帶等,但謝謝澄清。 :) – Joey 2010-07-22 21:44:18

+0

Sheesh,每個人都是批評家...... ACBurk的解釋很棒(程序員!) – pchap10k 2011-07-21 04:50:46

1

如果您分配另一個指針值前,正確地放棄所有權,不存在泄漏:

NSString *a = [[NSString alloc] init]; 
// ... 
[a release]; // relinquish ownership 
a = someOtherString; // fine, we don't own the previous instance anymore 

通過調用release放棄對象的所有權的那一刻,你應該考慮它有效地釋放 - 這可能一直是它的最後一個參考。指針仍然具有相同的值僅僅是實現和使用Objective-C類類型的副作用。

根據存儲限制和你的代碼做了什麼,你也可以使用autorelease d實例:

NSString *a = [NSString stringWithString:@"moo"]; 
a = someOtherString; // fine, a will be released later by the nearest autorelease pool 

注意,如果引用是不是一個局部變量,但伊娃,你可能會想改爲使用declared properties

0

你可以做到以下幾點:

NSString *myString = [NSString stringWithString:@"Test"]; 

返回的字符串會被自動釋放,所以你不必釋放它。你也不會「擁有」它。如果這是他人建議的問題,請在重新分配價值之前發送release消息至myString