关于可变数组/字典 不小心转换成 不可变数组/字典 实际应用举例(很隐蔽)

不可变数组/字典 是不能修改里面的值的,这点大家都很清楚,但是实际中会出现一种很隐蔽的问题:可变的悄悄的转化成了不可变的,有时候不注意就会崩溃,现在记录下来,供项目今后新人参考。

例如:

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"];

                    }

         }

 

所以这种很隐蔽的地方,大家以后一定要注意了。

posted @ 2018-06-01 10:53  yoowei  阅读(618)  评论(0编辑  收藏  举报