【问题标题】:How to not get different memory addresses for elements in a Realm List?如何不为领域列表中的元素获取不同的内存地址?
【发布时间】:2018-05-26 07:05:00
【问题描述】:

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

for element in array {
    ...
}

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

array.first

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

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

我不知道这是否有帮助或重要,但 Message 是 Realm 管理的对象,Attachment 也是如此。 message.attachments 是列表类型。

编辑:

我进一步调查发现它变得更加奇怪。 我有一个类 Message,它是一个 Realm 对象,并且有一个属性 List of Attachments,它们也是 Realm 对象。

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

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

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

这和我想象的不一样。

【问题讨论】:

  • 你为什么要关心内存地址呢?
  • 访问数组时可能会创建一个新的代理实例
  • @DávidPásztor 因为在另一个地方,我也使用了相同的附件数组,我想找出附件的索引,它返回 nil 因为它似乎是另一个实例。
  • @EpicPandaForce 你能解释一下“代理”是什么意思吗?
  • @tosi 这个问题很可能不是由内存地址差异引起的。 Realm Lists 不是 Swift 的 Array 那样简单的集合,这很容易导致内存地址差异。您应该编辑此问题以解释您正在尝试做什么以及它如何与您使用的代码一起工作,或者创建一个新问题并删除这个问题,因为您想要实现的目标似乎与您解释的完全不同你的问题。

标签: arrays swift realm memory-address


【解决方案1】:

虽然我还不完全明白,为什么两周前一切都按预期工作而无需覆盖函数,使用 Realm 函数 isSameObject 帮助我解决了我的问题。

class Attachment: Object {

    override func isEqual(_ object: Any?) -> Bool {
        return self.isSameObject(as: object as? Object)
    }
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的详细解答。我想我理解了您写的内容,但这并没有向我解释为什么在列表的同一索引处比较两个元素会返回 false。正如您在我的屏幕截图中看到的那样,我创建了一个表达式:message.attachments.first == message.attachments.first。顺便说一下,Attachment 类不会覆盖 == 运算符。
    • 这是因为 getter 没有为您提供对现有 Swift 对象的引用,而是在每次指向该索引处存在的任何数据库对象时创建一个新的 Swift 对象。
    猜你喜欢
    • 2016-10-30
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多