【问题标题】:Why does the Swift identity operator "===" return true for NSNumbers?为什么 Swift 标识运算符“===”为 NSNumbers 返回 true?
【发布时间】:2016-11-25 02:06:13
【问题描述】:

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

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

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

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

【问题讨论】:

  • @jtbandes:这很酷。我希望 JDK 能做这样的事情。对于经常使用的值,比一些内部化实例的缓存要好得多。
  • NSNumber 和 NSString 都得到特殊处理(tm,pat.pend.,保留所有权利)。
  • 这基本上是 stackoverflow.com/questions/4270121/… 的骗子,但从 Objective-C 的角度来看,它解决了这个问题。
  • @rmaddy 是的,看起来很像,尽管该问题的答案已经过时了:(

标签: swift


【解决方案1】:

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

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

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 都可以这样表示。比较它们是否相等的正确方法是==

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 2021-04-28
  • 2021-03-09
  • 2014-12-18
  • 2021-12-03
  • 1970-01-01
相关资源
最近更新 更多