将词典添加到词典的NSMutableArray

时间:2015-12-08 22:10:39

标签: ios objective-c dictionary

我有一个名为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中添加另一个字典?

由于

3 个答案:

答案 0 :(得分:1)

如果你看到这个,你的数组实际上不是一个可变数组。这是提示:

-[__NSCFArray insertObject:atIndex:]
  ^^^^^^^^^^^

该对象的类型为__NSCFArray,它是NSArray的内部副本。

即使您将变量声明为NSMutableArray,指针也可以指向任何类型的对象(例如NSRegularExpression的事件)。重要的是,它是如何创建的。

如果大多数人使用NSUserDefaultsNSJSONSerialization或其他任何内容序列化数组,就会发生这种情况。

关键是在使用

对数组进行反序列化时创建可变副本

-[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作为NSMutableArraysocailArray = [[dataDict valueForKey:@"socail"] mutableCopy];

希望这可以提供帮助。