我有一个名为NSMutableArray
的{{1}}在我登录时看起来像这样
myMutbaleArray
我想添加一个看起来像这样的对象
2015-12-08 17:04:21.679 APP[3342:573379] (
{
id = 19;
"num_test" = 100000;
url = "http://fsad.com";
},
{
id = 20;
"num_test" = 100001;
url = "http://teeeet.com";
}
)
所以我正在尝试这个
{
id = 21;
"num" = 100002;
url = "http://example.com";
}
但是当我这样做时,我得到了
[myMutbaleArray addObject:@{ @"id":@"23",@"num_test":@"100000", @"url":mainDict[@"website_url"],@"website_name":@"website"}];
我像这样初始化数组
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object'
为什么我可以在MutableArray中添加另一个字典?
由于
答案 0 :(得分:1)
如果你看到这个,你的数组实际上不是一个可变数组。这是提示:
-[__NSCFArray insertObject:atIndex:]
^^^^^^^^^^^
该对象的类型为__NSCFArray
,它是NSArray
的内部副本。
即使您将变量声明为NSMutableArray
,指针也可以指向任何类型的对象(例如NSRegularExpression
的事件)。重要的是,它是如何创建的。
如果大多数人使用NSUserDefaults
,NSJSONSerialization
或其他任何内容序列化数组,就会发生这种情况。
关键是在使用
对数组进行反序列化时创建可变副本 -[NSArray mutableCopy]
请注意,这是不是深层复制。这意味着根数组中包含的数组不会被可复制复制,需要单独替换。
使用以下方法可以实现深度复制:
// array
NSArray *originalArray = @[@"a", @"b", @[@1, @2]];
NSMutableArray *mutableArray = (NSMutableArray *)CFPropertyListCreateDeepCopy(kCFAllocatorDefault, (CFArrayRef)originalArray, kCFPropertyListMutableContainers);
// dictionary
NSDictionary *originalDictionary = @{@"a": @"b", @"c": @[@{@"abc": @123}]};
NSMutableDictionary *mutableDictionary = (NSMutableDictionary *)CFPropertyListCreateDeepCopy(kCFAllocatorDefault, (CFDictionaryRef)originalDictionary, kCFPropertyListMutableContainers);
答案 1 :(得分:0)
您应该将init更改为:
//inside connectionDidFinishLoading
socailArray = [NSMutableArray arrayWithArray:[dataDict valueForKey:@"socail"]];
因为:[dataDict valueForKey:@"socail"]
是NSArray
。
答案 2 :(得分:0)
使用socailArray = [dataDict valueForKey:@"socail"];
,[dataDict valueForKey:@"socail"]
的类型为NSArray
,因此会自动将socailArray
投射到NSArray
,这就是为什么你不能在此插入东西。
要避免这种情况,您必须使用以下socailArray
作为NSMutableArray
。
socailArray = [[dataDict valueForKey:@"socail"] mutableCopy];
希望这可以提供帮助。