2011-11-17 55 views
2

我試圖將數據保存到Iphone上的XML文件。爲此,我加載整個XML,添加新數據並再次保存。問題就出現了,當我嘗試存儲新的數據,我NSCFArray不充當NSArray

[mArray addObject:newData]; 

方法崩潰,因爲MARRAY不是NSMutableArray的,相反,它是一個NSCFArray即使我申請mutableCopy方法吧。 據我所知,NSCFArray是一個免費橋接到NSArray,所以我不明白爲什麼mutablyCopy方法不起作用。 任何想法?

NSMutableDictionary *wholeXML = [[NSMutableDictionary alloc] init]; 
wholeXML = xmlData; 

NSArray *array = [[NSArray alloc] init]; 
NSMutableArray *mArray = [[NSMutableArray alloc] init]; 
array = [wholeXML objectForKey:@"Key"]; 
mArray = [a mutableCopy]; 
+3

「a」來自哪裏獲得mutableCopy'消息調用? – Eimantas

回答

5

NSCFArray是當你做事情NSArray工廠方法或初始化該被實例化的私有子類。你正在做太多的初始化。試試這個簡化版本:

NSMutableDictionary *wholeXML = [[NSMutableDictionary alloc] initWithDictionary:xmlData]; 
NSMutableArray *mArray = [[NSMutableArray alloc] initWithArray:[wholeXML valueForKey:@"Key"]]; 
+0

它工作完美!非常感謝你! – MrSueko

2

NSCFArray是NSMutableArray和NSArray的具體類。這聽起來像你只是錯誤地認爲你有什麼樣的陣列。由於您發佈的代碼顯然不是您的真實代碼(它甚至不會編譯,即使發生問題也不會出現問題),因此無法確定您的程序在哪一點將變量分配給不可變數組。但這就是它正在發生的事情。

我會說(並且請不要將此作爲個人批評 - 這只是一個觀察),您發佈的代碼表明您對類和對象身份的工作方式沒有很好的掌握。這可能是這裏的根本原因。

您用[[Something alloc] init]初始化的所有三個變量,但是您立即丟棄該對象並將其替換爲其他值。這意味着原始對象(在這種情況下爲NSMutableArray)只會被泄漏,而變量現在包含您已分配的新對象。如果這個新對象不是一個NSMutableArray,它不會神奇地變成一個,因爲這是變量之前持有的。

+0

你說得對,我對發生的事情感到困惑。謝謝你的解釋!它幫助我更好地掌握髮生的事情! – MrSueko