Swift 比较内存地址

Posted

技术标签:

【中文标题】Swift 比较内存地址【英文标题】:Swift compare memory addresses 【发布时间】:2015-08-29 12:58:00 【问题描述】:

我想比较两个 Swift 对象的地址,比如:

let a: AnyObject
let b: AnyObject

a < b

当然这是不可能的,但我无法找到任何方法来实现这一点。

我可以只实现一个 C 函数来做到这一点

bool compare(NSObject *a, NSObject *b)
    return a < b;

然后像这样称呼它

compare(a, b)

但这限制了我使用NSObjects

所以我的问题是:有什么方法可以纯粹在 Swift 中实现这一点?

【问题讨论】:

【参考方案1】:

您可以使用返回UnsafePointer 值的unsafeAddressOf 函数。

let elm0 = "hello world"
let elm1 = UIButton()

let address0 = unsafeAddressOf(elm0)
let address1 = unsafeAddressOf(elm1)

let compare = address0 > address1

希望这会有所帮助。

【讨论】:

正是我想要的,比我自己的解决方案要好得多。这是在哪里记录的?我找不到这样的功能。 是的,但是您是如何找到该功能的?我不想每次都在寻找这样的全局函数时问一个问题。 ***.com/questions/24058906/… 好的,在 Stack Overflow 上进行深度搜索。遗憾的是 Swift 缺乏文档。感谢您的帮助。 我已经添加了苹果文档的链接(预发布,链接需要稍后更新)。【参考方案2】:

我找到了自己的答案。

有一个名为ObjectIdentifier 的结构,它可以为您提供一个 UIntValue 来标识一个对象。

这个 UIntValue 看起来很像它是对象引用,所以我将使用它:

class Person 
    var name: String

    init(name: String)
        self.name = name
    


NSLog("%p", ObjectIdentifier(Person(name: "James")).uintValue)
NSLog("%p", ObjectIdentifier(Person(name: "Berta")).uintValue)
NSLog("%p", ObjectIdentifier(Person(name: "Charly")).uintValue)

记录类似于:

2015-08-29 15:04:21.567 App[10724:5283560] 0x7ff3a8415830
2015-08-29 15:04:21.568 App[10724:5283560] 0x7ff3a8643ba0
2015-08-29 15:04:21.568 App[10724:5283560] 0x7ff3a8415830

【讨论】:

以上是关于Swift 比较内存地址的主要内容,如果未能解决你的问题,请参考以下文章

Swift中结构体的方法调度&内存分区

python3 id()is 内存地址

当我尝试与另一个 NSString 进行比较时,NSString 仅显示内存地址

详解:物理地址,虚拟地址,内存管理,逻辑地址之间的关系

「linux」物理地址,虚拟地址,内存管理,逻辑地址之间的关系

虚拟地址的高端内存