为什么 Swift 身份运算符 \\”===\\” 为 NSNumbers 返回 true? | 珊瑚贝

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)
// return true,

所以我的问题是 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
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 出色的深度博文:

  • 周五问

    • @JH_EARTH 您应该考虑接受这个答案。


来源:https://www.codenong.com/40796740/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9253.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?