如图,通俗点讲,我把红、黄两个球放入一个箱子里,结果打开箱子一看,里面都是红色的了。
我就一行代码写入数组,没什么复杂的
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>>";
键值不变,可是里面的值都变成一样了。这是怎么回事呢?
证明你还没有搞清楚C语言中的pointer这个概念。
在Objective-C当中,你没有搞清楚ARC这个内存管理的概念。
首先,你要搞清楚值传递和引用传递的概念。
然后再去理解,就会一目了然。
这里很明显你存储的数据是一样的,只是用了不同的Key。
如果你还是不明白,你应该问问自己:为什么值会不同,你明明就是存储一样的东西。
很明显,cell复用了,你要这样存就不要复用,不过你这样存的目的是干嘛??
FeedCell的内存是同一个
很明显,你存进去的是同一个cell(地址为0x7c133e00)。cell不同时间进行输出时,它的frame是不一样的。而且你很可能在重用时修改了它的tag值。