iOS NSDictionary 设置或改变里面的某个key的值及报错分析

一、

-(void)switchValueChange:(NSNotification*)noti {

NSDictionary*dict = [notiuserInfo];

NSString*str = [dictobjectForKey:@"SwitchChange"];

NSLog(@"str--[noti userInfo]:%@",str);//sender.on这个打印是对的

/*****优化方法:给sstatus赋值,******/

NSMutableDictionary*dataDict = (NSMutableDictionary*)settingArray[tag];

NSIntegerstatueInteger;

if([strintValue] == 1){

statueInteger = 0;

}else{

statueInteger = 1;

}

[dataDictsetObject:@"statueInteger"forKey:@"sstatus"];

[myTablereloadData];

}

二、会崩掉,原因:-[__NSDictionaryI setObject:forKey:]: unrecognized selector sent to instance 0x7fb1a650d730

三、原因分析:数组里的的对象是一个不可变字典,这点一定要注意。

然后,a = [data objectAtIndex:i];; 这句并不会将数组里的某个不可变字典变成可变,这点很重要。这里做的只是声明一个指针变量,并将数组里的一个对象的地址赋值给这个指针变量。数组objectOfIndex返回的是一个id类型对象,但你这里提取出来的是一个不可变字典,最后被一个声明为指向可变字典的指针接收了,但这并不意味着这个对象就变形了。所以不管你声明的是指向什么类型的变量,里面的对象不变。

所以改成这样吧。

NSMutableDictionary * a  = [NSMutableDictionary dictionaryWithDictionary:[data objectAtIndex:i]];

四、也就是说:

不能强制转换

要用:[NSMutableDictionary dictionaryWithDictionary:dict];

上面那个那个跟没转一样,还是不可变字典。

推荐阅读更多精彩内容

  • 一、 -(void)switchValueChange:(NSNotification*)noti { NSDic...
    28d8e2205eee阅读 4,685评论 0 0
  • 01-常量与变量 学习swift第一步打印Hello World print("Hello World") swi...
    iOS_恒仔阅读 3,856评论 2 19
  • 1.OC里用到集合类是什么? 基本类型为:NSArray,NSSet以及NSDictionary 可变类型为:NS...
    轻皱眉头浅忧思阅读 932评论 0 3
  • 关键词/关键类 1.#import跟#include有什么区别,@class呢,#import<>跟#import...
    丶逐渐阅读 909评论 0 1
  • 毕业十二年的高中同学终于相聚,我怀着朝圣般的心情来到了聚会中。看着那些认得出的,认不出的,没怎么变的,变化很大的,...
    方芳5阅读 263评论 0 0
  • 每一句晚安的背后充满着伪装与心酸。晚安但不一定会心安。渐渐的,晚安也不再是一句睡前温馨的话语,因为它以失去原本那美...
    猪猪女兜阅读 46评论 0 0
  • 听《创新者的窘境》,樊登老师在讲座里面提到的柯达、诺基亚、方正等等大企业病,我们的企业一样都有,樊登老师归结为企业...
    六爸啦啦啦阅读 122评论 0 0
  • 连续上了四个小时的专业课,真的是累,也不能一直集中全部注意力在这上面,然后按部就班的吃午饭睡午觉…度过了一个糟心的...
    ZH_FOREVER阅读 47评论 3 1