ios - 数组NSMutableDictionary。写入的时候是不同数据,但是里面存的数据变成一样了
PHPz
PHPz 2017-04-17 13:23:11
[iOS讨论组]

如图,通俗点讲,我把红、黄两个球放入一个箱子里,结果打开箱子一看,里面都是红色的了。

我就一行代码写入数组,没什么复杂的

NSLog(@"写入缓存key:%@ value:%@", key, cell);
[self.cellCache setValue:cell forKey:key];

整个app,我保证只有这里对数组进行写入。

看输出的日志:

写入缓存key:FeedTableCell299 value:<FeedCell: 0x7c133e00; baseClass = UITableViewCell; frame = (8 8; 304 540); hidden = YES; autoresize = W; tag = 299; layer = <CALayer: 0x7b2a6670>>
写入缓存key:FeedTableCell300 value:<FeedCell: 0x7c133e00; baseClass = UITableViewCell; frame = (8 8; 304 636.5); tag = 300; layer = <CALayer: 0x7b2a6670>>

很明显的看到,分别以不同的key,写入不同的value

结果打印这个字典的值出来,傻眼了。

FeedTableCell299 = "<FeedCell: 0x7c133e00; baseClass = UITableViewCell; frame = (0 0; 320 540); autoresize = W; tag = 299; layer = <CALayer: 0x7b2a6670>>";

FeedTableCell300 = "<FeedCell: 0x7c133e00; baseClass = UITableViewCell; frame = (0 0; 320 540); autoresize = W; tag = 299; layer = <CALayer: 0x7b2a6670>>";

键值不变,可是里面的值都变成一样了。这是怎么回事呢?

PHPz
PHPz

学习是最好的投资!

全部回复(4)
天蓬老师

很明显,你存进去的是同一个cell(地址为0x7c133e00)。cell不同时间进行输出时,它的frame是不一样的。而且你很可能在重用时修改了它的tag值。

高洛峰

FeedCell的内存是同一个

高洛峰

证明你还没有搞清楚C语言中的pointer这个概念。
在Objective-C当中,你没有搞清楚ARC这个内存管理的概念。

首先,你要搞清楚值传递和引用传递的概念。
然后再去理解,就会一目了然。

这里很明显你存储的数据是一样的,只是用了不同的Key。
如果你还是不明白,你应该问问自己:为什么值会不同,你明明就是存储一样的东西。

大家讲道理

很明显,cell复用了,你要这样存就不要复用,不过你这样存的目的是干嘛??

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

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