2011-03-09 131 views
0

这是代码。我用NSString进行了测试,并返回-1。但是对于NSMutableArray而言是0。为什么retainCount是0而不是1?

NSMutableArray *items = [[NSMutableArray alloc] init]; 

for(int i=0;i<10;i++) 
{ 
    [items addObject:[Possession randomPossession]]; 
} 

/*for(int i=0;i<[items count];i++) 
{ 
    NSLog(@"%@", [items objectAtIndex:i]); 
}*/ 



//Using Fast Enumeration 
/*for(items in items) 
{ 
    NSLog(@"%@", items); 
}*/ 


NSLog(@"%d", [items retainCount]); 

我在迭代中使用数组犯了错误。正确的应该是这样的。

//Using Fast Enumeration 
    for(Possession *item in items) 
    { 
     NSLog(@"%@", item); 
    } 

而且retainCount恢复正常预期1

+0

你能否澄清你的-1来自哪里,以及'NSString测试'是什么意思?谢谢! – wpearse 2011-03-09 03:44:09

+0

你的代码真的说“for(items in items)”吗?因为如果确实如此,一切都会破裂。 (特别是,“条目”在代码末尾与开始时不同,它并不是真的指向NSMutableArray。) – 2011-03-09 03:46:20

+0

完全同意Gareth McCaughan – makboney 2011-03-09 03:51:55

回答

7

A)你不应该看retainCount,甚至进行调试。这是一个内部实现细节,可以提供令人困惑的结果。

B)这:

for(items in items) 

几乎肯定你的意思 - 你正在使用的数组对象( “项目”)作为迭代器呢!例如:

for(Possession *item in items) 

会更有意义。


更新:

你可能想看看一些在苹果的documentation on fast enumeration的例子。你真的想有一个单独的变量作为你的循环迭代器。你在做什么(for(items in items))将items依次设置到数组中的每个对象,当你退出循环时,items将会是nil

+0

我实际上试图通过从上面的注释代码转换来快速枚举。因为我已经初始化了NSMutable数组,所以我不认为有必要做(项目中的Possession *项)。 CMIIW。 – sayzlim 2011-03-09 04:02:47

+0

我指出你的错误。你能向我解释为什么我需要为上面的代码创建一个新的Possession *项目吗? – sayzlim 2011-03-09 04:06:30

+0

@Sayz Lim,你没有创建一个新的'Possession * item' ...你只是在创建一个新的变量来存储它。 – 2011-03-09 04:12:23