NSDictionary是开发中很常用的数据类型,当NSDictionary 已经创建好了,直接对某个key对应的value做修改而产生新的NSDictionary时,
需要做mutableCopy操作,不然所有的修改只会已最后一次修改作为参考,保留最后修改的值
例:information_group_names为初始化的array,例如包含 餐饮,财经,股票。。。。
NSDictionary *temp = @{NOMALKEY: @"normal.png", //初始化NSDictionary
HEIGHTKEY:@"helight.png",
TITLEKEY:@"头条",
TITLEWIDTH:[NSNumber numberWithFloat:60]
};
NSMutableArray *vBtnItems = [[NSMutableArray alloc] init];
for (NSString *str in information_group_names) {
[temp setObject:str forKey:TITLEKEY]; //尝试改变标题
[vBtnItems addObject:temp];
}
以上这样做,最后得到的 vBtnItems数组里面包含的所有temp字典的TITLEKEY都是一样的值,为最后一次对TITLEKEY所赋的值,比如股票,就全部为股票了。。。。
改进:
NSDictionary *temp = @{NOMALKEY: @"normal.png",
HEIGHTKEY:@"helight.png",
TITLEKEY:@"头条",
TITLEWIDTH:[NSNumber numberWithFloat:60]
};
NSMutableArray *vBtnItems = [[NSMutableArray alloc] init];
NSMutableDictionary *vNewDic = [temp mutableCopy]; //装载
for (NSString *str in information_group_names) {
[vNewDic setObject:str forKey:TITLEKEY];
NSDictionary *tempdict = [vNewDic copy]; //copy对象而不是直接装存
[vBtnItems addObject:tempdict];
}
2. copy 返回一个不可变对象。分两种情况:(1)若原对象是不可变对象,那么返回原对象,并将其引用计数加 1 ;(2)若原对象是可变对象,那么创建一个新的不可变对象 ,并初始化为原对象的值 ,新对象的引用计数为 1。