【发布时间】: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