不可变数组/字典 是不能修改里面的值的,这点大家都很清楚,但是实际中会出现一种很隐蔽的问题:可变的悄悄的转化成了不可变的,有时候不注意就会崩溃,现在记录下来,供项目今后新人参考。
例如:
1、属性定义的是NSMutableArray
@property (nonatomic, strong) NSMutableArray *layoutModelArray;//属性定义
进行赋值操作:
self.layoutModelArray = [[dict objectForKey:@"data"] objectForKey:@"cards"];
进行替换操作:
[self.layoutModelArray replaceObjectAtIndex:i withObject:layoutDic];
崩溃:原因是不可变数组不能修改
[__NSArrayI replaceObjectAtIndex:withObject:]: unrecognized selector sent to instance 0x60400066cc40
相应的策略如下即可:
self.layoutModelArray = [[[dict objectForKey:@"data"] objectForKey:@"cards"] mutableCopy];
或者是:
NSMutableArray *yooweiArry=[NSMutableArray arrayWithArray:[[dict objectForKey:@"data"] objectForKey:@"cards"]];
2、类似的例子:
NSArray *items = layoutDic[@"items"];//拿到布局里面的组件
NSDictionary *itemsFirst = items.firstObject;//其实我们定义的就一个元素
NSMutableDictionary *tempItemsFirst=[itemsFirst mutableCopy]; //注意
if (temListIndic&&temListIndic.count>0) {
if ([tempItemsFirst objectForKey:@"style"]) {
NSMutableDictionary*testOne=[[tempItemsFirst objectForKey:@"style"] mutableCopy]; //注意
if ([testOne objectForKey:@"height"]) {//其实可以不用判断
[testOne setValue:@"60" forKey:@"height"];
}
[tempItemsFirst setValue:testOne forKey:@"style"];
}
}
所以这种很隐蔽的地方,大家以后一定要注意了。