2011-03-09 215 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