为什么下面代码往数组中添加内容会得到这样的结果?

    _dataSource = [NSMutableArray array];
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    [dict setObject:@"离我最近" forKey:@"type"];
    [dict setObject:@"找出离您当前位置最近的所有商家" forKey:@"detail"];
    [_dataSource addObject:dict];

    [dict removeAllObjects];
    [dict setObject:@"人气" forKey:@"type"];
    [dict setObject:@"人气反应一个商家受欢迎的程度" forKey:@"detail"];
    [_dataSource addObject:dict];

    [dict removeAllObjects];
    [dict setObject:@"热度" forKey:@"type"];
    [dict setObject:@"热度反应一个商家被用户认可的成都" forKey:@"detail"];
    [_dataSource addObject:dict];

    [dict removeAllObjects];
    [dict setObject:@"系数" forKey:@"type"];
    [dict setObject:@"系数是一个商家是否优秀的体现" forKey:@"detail"];
    [_dataSource addObject:dict];

最后结果是_dataSource中有四个一模一样的字典。都是{type:系数,detail:系数是一个商家是否优秀的体现}

阅读 4k
4 个回答
_dataSource = [NSMutableArray array];
[_dataSource addObject:@{@"type" : @"离我最近",
                         @"detail" : @"找出离您当前位置最近的所有商家"}];
[_dataSource addObject:@{@"type" : @"人气",
                         @"detail" : @"人气反应一个商家受欢迎的程度"}];
[_dataSource addObject:@{@"type" : @"热度",
                         @"detail" : @"热度反应一个商家被用户认可的成都"}];
[_dataSource addObject:@{@"type" : @"系数",
                         @"detail" : @"系数是一个商家是否优秀的体现"}];

你要重新认识一下指针,引用,相对的关系。
你目前的代码,加了4个相同的引用给_dataSource,4个对象指向一个地址。

因为当把 dict 加入到 _datasource 时,二者的指针指向的是同一个内存地址,你看一下 iOS 的指针吧

字典当然是 kv 存储的啦,你 key 都是@"detail",代码的意思就是一遍一遍的覆盖 dict[@"detail"] 这个的值……

还有感觉你这 dataSource 实现的有问题,dataSource 不应该是实现啥啥啥啥的协议的类才叫dataSource么?你弄一个 items 来做 dataSource 是不是有点不妥呢?你再想想?是不是细思极恐呢?

不要紧张,仔细看下这篇文章:http://objccn.io/issue-1-1/

新手上路,请多包涵

往字典中添加object是retain操作,所以都是对同一份对象dict进行removeAllObjects和setObject的操作

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题