如果我在 Swift 中迭代一个数组:
for element in array {
...
}
并在 for 语句中放置一个断点并查看存储为元素的对象的地址,然后我得到的地址与让调试器运行表达式时得到的地址不同:
array.first
数组中只有一个元素。那么,为什么我得不到相同的地址呢? 这是运行中的调试器的屏幕截图:
我正在遍历邮件的附件。我调试的时候邮件只有一个附件。调试器也在第一次迭代中停止。在我的两个表达式中你可以看到,那个附件有另一个地址而不是 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模式下移动并且只是多次运行相同的表达式时,我什至会得到不同的地址:
这和我想象的不一样。
最佳答案
Realm List
不是 Swift Array
。 List
中的对象实际上是指向数据库中逻辑对象位置的指针的包装,并且每次检索 List
的元素时都会重新创建。
Realm 不会任何保证来 self 们的对象检索 API 的 Realm 对象实例在指针比较的基础上是否相等;我们所做的任何语义保证都与数据库本身内对象的身份有关。 (数据库中的单个给定对象可能由许多 Object
实例表示,每个实例可能是不同的 Swift 对象,但都指向相同的底层 Realm 对象。)
关于arrays - 如何不为 Realm 列表中的元素获取不同的内存地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47775273/