2012-10-01 56 views
4

當運行下面的代碼時,[dict setValue:@"null" forKey:@"name"];不斷崩潰。我在這裏搜索,發現其他帖子是由不使用NSMutableDictionary的人造成的。不過,我正在使用這個。- [__ NSCFDictionary setObject:forKey:]:發送到不可變對象的變異方法

爲什麼如果namenull這個行崩潰?

NSMutableArray *tempCustomers = [[NSMutableArray alloc] init]; 
for (NSMutableDictionary *dict in [[json objectForKey:@"data"] mutableCopy]) { 
    if ([dict objectForKey:@"name"] == [NSNull null]) { 
     [dict setValue:@"null" forKey:@"name"]; 
    } 
    [tempCustomers addObject:dict]; 
} 
+2

也許mutableCopy不是「deepMutableCopy」,我的意思是,你剛纔列舉可變對象,但對象在此集合中是不可變的? – BergP

+2

您正在使用不可變對象的可變字典 – nielsbot

回答

15

最後我用這個。我猜這是什麼deepMutableCopy是?

NSMutableArray *tempCustomers = [[NSMutableArray alloc] init]; 
for (NSMutableDictionary *dict in [[json objectForKey:@"data"] mutableCopy]) { 
    if ([dict objectForKey:@"name"] == [NSNull null]) { 
     NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] init]; 
     tempDict = [dict mutableCopy]; 

     [tempDict setValue:@"null" forKey:@"name"]; 
     [tempCustomers addObject:tempDict]; 
    } else { 
     [tempCustomers addObject:dict]; 
    } 
} 
+0

這近似於深層可變副本 - 基本上,您還需要一個可變的「dict」副本,而不僅僅是JSON對象的數據。儘管原始的字典集合可以通過mutableCopy變爲可變,但您試圖修改的每本字典本身都是不可變的。 (「深拷貝」一詞是指所有包含的數據結構的遞歸拷貝,而不僅僅是頂層。) – Tim

+0

@Tim和上面編輯的代碼一樣嗎? – Bot

+0

準確地說。你得到JSON數據的可變副本(它仍然有不可變的字典),然後你爲每個字典做一個可變的副本 - 這近似於一個「深層可變副本」,即使它不是在一個單獨的方法中。 – Tim

2

也許mutableCopy不是「deepMutableCopy」,我的意思是,你剛纔列舉可變對象,但對象在此集合中是不可變的(副本從我的評論)

0

創建新陣列[[NSMutableArray alloc]initWithArray:[json objectForKey:@"data"]],並用它在for循環

[json objectForKey:@"data"],而不是運行它更換到新陣列。 它應該是這樣的:

NSMutableArray *tempCustomers = [[NSMutableArray alloc] init]; 
NSMutableArray *search = [[NSMutableArray alloc]initWithArray:[json objectForKey:@"data"]]; 
for (NSMutableDictionary *dict in search) 
{ 
    if ([dict objectForKey:@"name"] == [NSNull null]) 
    { 
     [dict setValue:@"null" forKey:@"name"]; 
    } 
    [tempCustomers addObject:dict]; 
} 
相關問題