ios - 为什么下面代码往数组中添加内容会得到这样的结果?
迷茫
迷茫 2017-04-17 13:26:44
[iOS讨论组]
    _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:系数是一个商家是否优秀的体现}

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

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

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

PHPz

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

PHPz

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

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

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

黄舟

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号