2010-02-24 164 views
0

這是將對象從陣列前面彈出的正確方法。我只是好奇,因爲我認爲可能有一個NSMutableArray方法返回一個保留的對象。只是好奇,如果我得到這個權利?NSMutableArray,添加/刪除對象?

// PUTTING OBJECTS IN 
NSMutableArray *fgStore = [[NSMutableArray alloc] init]; 
for(int counter=1; counter<=5; counter++) { 
    NSString *dataValue = [[NSString alloc] initWithFormat:@"DATA%d", counter]; 
    [fgStore addObject:dataValue]; 
    [dataValue release]; 
} 

// TAKING OBJECTS OUT 
NSString *saveMe = [[fgStore objectAtIndex:0] retain]; 
[fgStore removeObjectAtIndex:0];  
NSLog(@"SAVE: %@", saveMe); 
... 
... 
[fgStore release]; 
[saveMe release]; 

加里

+0

我現在認爲我在上面得到了錯誤的措辭,關於「返回一個保留的對象」。我想我想說的是一個「管理對象」?據此我不需要自己做一個保留。那有意義嗎? – fuzzygoat 2010-02-24 17:20:36

+0

「保留」在這種情況下是有意義的。 「管理」不,至少不適合我。 – zoul 2010-02-24 17:28:58

+0

謝謝,是的,我明白了。保留其返回時的保留數+1。基本上,我不需要保留它,只需在完成時釋放它。非常感激。 – fuzzygoat 2010-02-24 17:37:16

回答

2

這正是我會做,我不認爲還有另一種方式。通過返回一個保留的對象,你可能會破壞Cocoa內存管理的主要規則之一:大多數情況下,你只擁有init…方法返回的對象,並且必須保留其餘部分。

1

該代碼看起來不錯。您可能想要記住的唯一事情是,您可以使用autorelease來避免在完成時顯式發佈。例如:

for(int counter=1; counter<=5; counter++) { 
    NSString *dataValue = [[[NSString alloc] 
          initWithFormat:@"DATA%d", counter] autorelease]; 
    [fgStore addObject:dataValue]; 
} 

我不相信有任何NSMutableArray方法返回一個保留的對象。請記住,返回保留值的方法具有以alloc,new或copy開頭的名稱。

+0

有些人會對autorelease不滿,因爲他們只在必要時使用自動釋放。 (我猜是風格問題。)另外,'NSString'有一個方便的'stringWithFormat'類方法,所以'alloc'和'autorelease'對是額外的,但這是挑剔的。 – zoul 2010-02-24 17:09:24

+0

是的,關於NSString便捷方法的好處。這將使最可讀的代碼。 – nall 2010-02-24 17:15:51

+0

謝謝你們,我打算明確發佈,因爲我在iPhone上工作,我想確保手動釋放東西以保持我的記憶足跡儘可能低。 (即不等待自動釋放池被排空),這是我的推理反正...... – fuzzygoat 2010-02-24 17:17:05