Why does the Swift identity operator “===” return true for NSNumbers?
运算符”===”应该比较类引用以确定双方是否引用同一个对象:
1
2 3 4 5 |
var objectA : NSNumber = 1
var objectB : NSNumber = 1 print(objectA === objectB) |
所以我的问题是 NSNumber 将对象package成同一个对象,这样做的后端逻辑如何。
- mikeash.com/pyblog/…
- @jtbandes:这很酷。我希望 JDK 能做这样的事情。对于经常使用的值,比一些内部化实例的缓存要好得多。
- NSNumber 和 NSString 都得到特殊处理(tm,pat.pend.,保留所有权利)。
- @Thilo 至少,JVM 确实对字符串进行了实习
- 这基本上是对 stackoverflow.com/questions/4270121/… 的欺骗,但它从 Objective-C 的angular解决了这个问题。
- @Thilo 我对 JDK 没有任何经验,所以我无法真正发表评论,但它似乎是一个非常相似的优化。并不是所有的 NSNumber 都可以用这种方式表示,例如我刚刚尝试了 0xFFFFFFFFFFFFFFF,它给了我一个新对象。
- @rmaddy 是的,看起来是这样,尽管该问题的答案已经过时了:(
- 也在这里:iOS – 为什么当我用”==”比较两个 NSNumber 时它会起作用?
- @matt 1)所以 String 没有得到这种特殊处理,因为它是值类型,但 NSString 确实得到它,因为它是引用类型? 2)我尝试了两个具有相同文字值的数字,它返回 true,但是当我尝试使用相同文字值的 NSStrings 时,它返回 false,所以当你说它们得到特殊处理时我感到困惑。您的意思是 NSString 和 NSNumber 的特殊处理方式彼此不同吗?
NSNumber 是少数几个有时可以表示为标记指针的类之一(至少在 Apple 平台上;我认为这不适用于 (Core)Foundation 的开源版本)。
基本上,这意味着 NSNumber 不是指向位于内存中其他位置的类的实际实例的指针,而是将其值(在本例中为 1)直接存储在指针内。你可以自己看看:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 |
import Foundation
let x: NSNumber = 1 // Tagged pointers: the number is stored inside the pointer representation. class C {} // Not a tagged pointer; just a regular pointer to allocated memory. |
同样的优化也可以应用于 NSString 和其他类型。有关更多详细信息,请阅读 Mike Ash 出色的深度博文:
-
周五问
- @JH_EARTH 您应该考虑接受这个答案。
来源:https://www.codenong.com/40796740/