簡體   English   中英

將字典添加到字典的NSMutableArray

[英]Add Dictionary to NSMutableArray of Dictionaries

我有一個名為myMutbaleArrayNSMutableArray ,在登錄時看起來像這樣

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'

我這樣初始化數組

@interface {
NSMutableArray *socailArray;
}
//inside connectionDidFinishLoading
socailArray = [dataDict valueForKey:@"socail"];

為什么要向MutableArray添加另一個字典?

謝謝

如果看到此消息,則您的數組實際上不是可變數組。 這是提示:

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

該對象的類型為__NSCFArray ,它是NSArray的內部副本。

即使將變量聲明為NSMutableArray ,指針也可以指向任何類型的對象(例如NSRegularExpression事件)。 重要的是如何創建它。

如果大多數人使用NSUserDefaultsNSJSONSerialization或其他方法序列化一個數組,這對大多數人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);

您應該將init更改為:

//inside connectionDidFinishLoading
 socailArray  = [NSMutableArray arrayWithArray:[dataDict valueForKey:@"socail"]];

因為: [dataDict valueForKey:@"socail"]是一個NSArray

使用socailArray = [dataDict valueForKey:@"socail"]; [dataDict valueForKey:@"socail"]NSArray ,因此它socailArray自動socailArrayNSArray ,這就是為什么您不能在其中插入內容的原因。

為避免這種情況,您必須使用以下socailArray = [[dataDict valueForKey:@"socail"] mutableCopy];socailArray作為NSMutableArray持有: socailArray = [[dataDict valueForKey:@"socail"] mutableCopy];

希望這會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM