运算符“===”应比较类引用以确定双方是否引用相同的对象:
var objectA : NSNumber = 1
var objectB : NSNumber = 1
print(objectA === objectB)
// return true,
所以我的问题是NSNumber
将对象包装到同一个对象中,这样做的后端逻辑是怎样的。
答案 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都可以用这种方式表示。比较它们的正确性的正确方法是==
。