NSCFArray不作为NSArray

时间:2011-11-17 18:20:48

标签: objective-c nsarray

我正在尝试将数据保存到Iphone上的XML文件中。为此,我加载整个XML,添加新数据并再次保存。当我尝试存储新数据时出现问题,我的

 [mArray addObject:newData];

方法崩溃,因为mArray不是NSMutableArray,相反,即使我对它应用了mutableCopy方法,它也是一个NSCFArray。 据我所知,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];

2 个答案:

答案 0 :(得分:5)

NSCFArray是一个私有子类,当您使用NSArray工厂方法或初始化程序执行操作时,它会被实例化。你做了太多的初始化。试试这个简化版本:

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

答案 1 :(得分:2)

NSCFArray是NSMutableArray和NSArray的具体类。听起来你只是错误地认为你有什么样的阵列。由于您发布的代码显然不是您真正的代码(它甚至不会编译,即使它没有出现问题),也无法确定您的程序在什么时候为变量分配不可变数组。但这听起来似乎正在发生。

我会说(并且请不要将此作为个人批评 - 这只是一个观察),您发布的代码表明您对类和对象标识的工作方式没有很强的把握。这可能是这里的根本原因。

您使用[[Something alloc] init]初始化所有三个变量,但随后您立即丢弃该对象并将其替换为其他内容。这意味着原始对象(在这种情况下为NSMutableArray)刚刚泄露,变量现在包含您已分配的新对象。如果那个新对象不是NSMutableArray,那么它就不会神奇地变成一个,因为这就是变量之前所拥有的。