arrays - 如何不为 Realm 列表中的元素获取不同的内存地址?

标签 arrays swift realm memory-address

如果我在 Swift 中迭代一个数组:

for element in array {
    ...
}

并在 for 语句中放置一个断点并查看存储为元素的对象的地址,然后我得到的地址与让调试器运行表达式时得到的地址不同:

array.first

数组中只有一个元素。那么,为什么我得不到相同的地址呢? 这是运行中的调试器的屏幕截图:

enter image description here

我正在遍历邮件的附件。我调试的时候邮件只有一个附件。调试器也在第一次迭代中停止。在我的两个表达式中你可以看到,那个附件有另一个地址而不是 attachments.first

我不知道这是否有帮助或重要,但 Message 是一个由 Realm 管理的对象,Attachment 也是。 message.attachments 是 List 类型。

编辑:

我进一步调查,结果变得更奇怪了。 我有一个 Message 类,它是一个 Realm 对象并且有一个附件属性列表,它也是 Realm 对象。

import RealmSwift
class Message: Object {
    let attachments = List<Attachment>()
    ...
}
class Attachment: Object {
    ...
}

我调试了附加附件的地方。处理完所有附件后,我可以请求第一个元素并始终获得具有相同内存地址的相同实例。行为符合我的预期。

当稍后使用的消息在 View 中传递时,我可以看到消息的地址在每个持有引用的 View 中都是相同的。但是如果我随后要求第一个附件,我总是得到一个不同的地址。当不在 Debug模式下移动并且只是多次运行相同的表达式时,我什至会得到不同的地址:

enter image description here

这和我想象的不一样。

最佳答案

Realm List 不是 Swift ArrayList 中的对象实际上是指向数据库中逻辑对象位置的指针的包装,并且每次检索 List 的元素时都会重新创建。

Realm 不会任何保证来 self 们的对象检索 API 的 Realm 对象实例在指针比较的基础上是否相等;我们所做的任何语义保证都与数据库本身对象的身份有关。 (数据库中的单个给定对象可能由许多 Object 实例表示,每个实例可能是不同的 Swift 对象,但都指向相同的底层 Realm 对象。)

关于arrays - 如何不为 Realm 列表中的元素获取不同的内存地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47775273/

相关文章:

ios - 如何在 Swift 中以编程方式为 UILabel 提供动态高度?

ios - 如何获取具有最大 ID 的项目?

ios - iOS OC,如何将RLMObject转换为NSDictionary,NSArray?

java - ByteBuffer 导致下溢异常

java - 在 Android 中更改 Activity 时如何保持 ArrayList 值

java - 使用 for 循环用两个一维数组填充二维数组

javascript - 从数组中找到所有缺失的字母

swift - 如何获取核心数据sqlite文件位置

swift - 如何以编程方式在容器内实现 TableView?

swift - Swift 中的 Realm 一对多关系