为什么Swift标识运算符“===”对NSNumbers返回true?

时间:2016-11-25 02:06:13

标签: swift

运算符“===”应比较类引用以确定双方是否引用相同的对象:

var objectA : NSNumber = 1
var objectB : NSNumber = 1

print(objectA === objectB)
// return true, 

所以我的问题是NSNumber将对象包装到同一个对象中,这样做的后端逻辑是怎样的。

1 个答案:

答案 0 :(得分:2)

NSNumber是少数类之一,有时可以表示为标记指针(至少在Apple平台上;我不认为这适用于开源版本的(核心)基金会)。

基本上,这意味着NSNumber不是指向位于内存中其他位置的类的实际实例的指针,而是将其值(在本例中为1)直接存储在指针< / strong>即可。你可以自己看看:

import Foundation

let x: NSNumber = 1
let y: NSNumber = 2

// Tagged pointers: the number is stored inside the pointer representation.
print(Unmanaged.passUnretained(x).toOpaque())  // 0x0000000000000137
print(Unmanaged.passUnretained(y).toOpaque())  // 0x0000000000000237

class C {}
let c = C()

// Not a tagged pointer; just a regular pointer to allocated memory.
print(Unmanaged.passUnretained(c).toOpaque())  // 0x00007fb32276daa0

同样的优化也可以应用于NSString和其他类型。有关更多详细信息,请阅读Mike Ash的精彩深入博客文章:

然而,不要依赖此 。它只是一个实现细节,并非所有NSNumber都可以用这种方式表示。比较它们的正确性的正确方法是==