RLMArray<>每次返回不同的实例



@领域:

为什么我的RLMArray在运行时提供不同的对象实例?

这就是我如何定义我的RLMArray:

@property RLMArray<HouseImage> *images;

我一直在此数组中添加/删除HouseImage对象(在事务中(。

当我访问图像时:

_house.images[indexPath.row]

每次我得到不同的实例,即

(lldb) p _house
(RLMAccessor_v0_House *) $52 = 0x00000001701a5780
2015-08-30 23:02:07.695 Apt Note[5992:1308601] Loading image named: 1C178A31-5F33-4CD3-9B7C-B026DF7A5E19_2
2015-08-30 23:02:07.731 Apt Note[5992:1308601] Loading image named: CFD99689-12C4-49CB-AAB6-850FFCD902D7_3
2015-08-30 23:02:07.750 Apt Note[5992:1308601] Loading image named: 194D55EA-125A-4CFC-8CCF-758E929BE7D5_4
// This is the first time when iterating the array. The [house] object remains same, but not the images array items.
(lldb) p _house
(RLMAccessor_v0_House *) $53 = 0x00000001701a5780
(lldb) p _house.images[0]
(RLMAccessor_v0_HouseImage *) $54 = 0x00000001740bbf60
2015-08-30 23:02:36.947 Apt Note[5992:1308601] Loading image named: 1C178A31-5F33-4CD3-9B7C-B026DF7A5E19_2
2015-08-30 23:02:36.986 Apt Note[5992:1308601] Loading image named: CFD99689-12C4-49CB-AAB6-850FFCD902D7_3
2015-08-30 23:02:37.031 Apt Note[5992:1308601] Loading image named: 194D55EA-125A-4CFC-8CCF-758E929BE7D5_4
// This is the second iteration
(lldb) p _house
(RLMAccessor_v0_House *) $55 = 0x00000001701a5780
(lldb) p _house.images[0]
(RLMAccessor_v0_HouseImage *) $56 = 0x00000001740bc140

如果您看到我的日志,则house对象保持不变。然而,RLMArray(images(中的实例却突然发生了变化。在这种情况发生时,除了这段代码之外,没有人在读/写领域。

有人知道为什么会发生这种事吗?

如果我不清楚,请告诉我,我会尽量解释得更清楚。

这是预期的行为。为了实现零拷贝存储系统,Realm根本不保存实际数据。Realm为您的持久化属性刷新属性访问器,以动态获取属性,因此当您多次访问该属性时,它实际上每次都会返回一个不同的实例。RLMArray也和它一样。所以每次你想访问RLMArray的元素时,Realm都会创建一个不同的代理对象来返回。

仅供参考:如果对象没有持久化,RLMArray每次都会返回相同的实例。因为RLMArray刚好由NSArray支持https://github.com/realm/realm-cocoa/blob/master/Realm/RLMArray.mm#L153-L159.

但是,一旦对象被持久化,RLMArray就会变为RLMArrayLinkView。由于上述原因,RLMArrayLinkView每次都会返回不同的实例。https://github.com/realm/realm-cocoa/blob/master/Realm/RLMArrayLinkView.mm#L193-L197

最新更新