不可变字典和可变字典的误区

不可变字典和可变字典的误区_第1张图片

 

突然想着set一个值进去,为了方便点,在同一个对象中拿值,结果竟然崩溃,百思不得其解,后来通过property的方式传值过去。第二天早上仔细研究了下 ,原先的流程是一开始在didload里面创建了可变字典 

- (void)viewDidLoad {

    [super viewDidLoad];

    [_mTableView setBackgroundColor:[UIColor clearColor]];

    [self setTitle:@"添加银行卡"];

    _mTableView.tableFooterView=_footView;

    _footView.backgroundColor=CLEARCOLOR;

    dicCardBin=[[NSMutableDictionary alloc] init];

    // Do any additional setup after loading the view.

   }

请求数据的时候      dicCardBin =(NSMutableDictionary *)responseData;

  [dicCardBin setObject:[cellTwo.mTextField.text delectSpace] forKey:@"bankCard"]; //此时崩溃

问了楠哥,楠哥很严肃反问,不可变字典转可变字典是这样转的吗?当时就感觉可能就是这个地方错了,虽然这么赋值dicCardBin是可以接到服务器返回来的值,可以作为后面的处理,但是其实还是属于不可变字典,尽管定义和构造看起来是不可变的,原因正是出在这里,因为本人觉得不可变字典虽然setValue不可用,但是不至于setObject也不可用吧! 经过楠哥指点,加上我当时顿悟,立马回去改写,运行了下,完全没有问题,一次过!

改写是这样的,didload立马方法注释掉//dicCardBin=[[NSMutableDictionary alloc] init];

在请求的时候

  if (responseData) {

                            //得到用户输入卡的类型

//                            dicCardBin =(NSMutableDictionary *)responseData;

                               dicCardBin=[[NSMutableDictionary alloc] initWithDictionary:responseData];

                            [dicCardBin setObject:[cellTwo.mTextField.text delectSpace] forKey:@"bankCard"];

}

这么处理就可以了。看起来很简单,不遇到问题和联系实际场景,根本感觉不到。

最早写这个的时候,当时就是怕写在请求里面会构造多次,还要做非空判断,太麻烦,倒不如直接didload里面早点构造了算了,结果三年后,自己的坑自己去踩。最基础的其实还是最重要的。那些你理解不了的基础还是要从项目中实践。

你可能感兴趣的:(苹果)