![](/img/trans.png)
[英]How to remove all dictionaries from NSMutableArray based on the value in the dictionary
[英]Add Dictionary to NSMutableArray of Dictionaries
我有一個名為myMutbaleArray
的NSMutableArray
,在登錄時看起來像這樣
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
事件)。 重要的是如何創建它。
如果大多數人使用NSUserDefaults
, NSJSONSerialization
或其他方法序列化一個數組,這對大多數人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
自動socailArray
為NSArray
,這就是為什么您不能在其中插入內容的原因。
為避免這種情況,您必須使用以下socailArray = [[dataDict valueForKey:@"socail"] mutableCopy];
將socailArray
作為NSMutableArray
持有: socailArray = [[dataDict valueForKey:@"socail"] mutableCopy];
希望這會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.