NSMutableArray,添加/删除对象?

问题描述:

这是将对象从阵列前面弹出的正确方法。我只是好奇,因为我认为可能有一个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

这正是我会做,我不认为还有另一种方式。通过返回一个保留的对象,你可能会破坏Cocoa内存管理的主要规则之一:大多数情况下,你只拥有init…方法返回的对象,并且必须保留其余部分。

该代码看起来不错。您可能想要记住的唯一事情是,您可以使用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