Swift 中是不是有 API 来确定 iOS 设备的处理器寄存器大小?

Posted

技术标签:

【中文标题】Swift 中是不是有 API 来确定 iOS 设备的处理器寄存器大小?【英文标题】:Is there an API in Swift to determine processor register size of iOS device?Swift 中是否有 API 来确定 iOS 设备的处理器寄存器大小? 【发布时间】:2015-08-06 18:44:07 【问题描述】:

我正在向用户显示他们的设备是 32 位还是 64 位。目前,我正在根据 UInt.max 的值确定:

let cpuRegisterSize = count(String(UInt.max, radix: 2))

感觉有点 hacky,所以我想知道 Swift 中是否有一个 API 可以返回那个值。据我所知,UIDevice 似乎没有保存这些信息。

【问题讨论】:

除了“UInt 的大小是多少”之外,除了“如果设备是其中之一,我知道它是 32 位那么它是 32 位;否则它是 64”之外,可能没有其他测试。或者真的很老套的东西,比如不要为 ARMv7 构建和时间整数除法,任何理智的人都不会实现。幸运的是,我猜那些关心的用户可能技术足够好,可以容忍极端情况下的错误结果。 您想检查设备是否有 64 位处理器,或者应用程序是否在 64 位模式下运行?那是不同的问题。比较Determine if ios device is 32- or 64-bit,这与 (Objective-)C 的问题相同,并且对这两个问题都有答案。 我正在执行一些按位运算,并在执行前检查结果是否会导致溢出。所以我猜UInt的大小,由平台决定,才是最重要的。谢谢你的链接,马丁。这没有出现在我在这里和谷歌的搜索中。 【参考方案1】:
MemoryLayout<Int>.size == MemoryLayout<Int32>.size ? 32 : 64

【讨论】:

当然,现在已经不重要了——Apple 已经表示他们可能会在 iOS 11 中放弃对 32 位应用程序的所有支持。 这看起来应该可以工作,但是对于未来(因为您是该网站的新手),您应该尝试备份您在答案中发布的代码,并解释其工作原理.至少在这种情况下,这是不言自明的,但您仍应尝试至少发布一两句话。 或者让 size = MemoryLayout.size * 8 当然,这仍然很重要——Apple 仍在发售 32 位设备,即 Apple Watch。更不用说其他架构了,比如 Raspi。【参考方案2】:

在 32 位设备上,CGFloat 是浮点数。在 64 位设备上,CGFloat 是 Double。所以你可以使用CGFLOAT_IS_DOUBLE 来检测当前的架构。

let bit = 32 * (CGFLOAT_IS_DOUBLE + 1)

你也可以使用sizeof(Int):

let bit = sizeof(Int) == sizeof(Int64) ? 64 : 32

【讨论】:

这会检查应用程序是在 32 位还是 64 位模式下编译的。 64 位设备可以运行 32 位代码。 64 位 iOS 设备需要 64 位代码才能提交到应用商店,并且将在 64 位设备上运行该代码,因此如果新编写的 32 位代码正在设备上运行,则该设备是 32 位的。

以上是关于Swift 中是不是有 API 来确定 iOS 设备的处理器寄存器大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测 iOS 设备是不是处于静音模式?

iOS上是不是有用于频繁位置历史的API?

Swift:确定iOS屏幕尺寸[重复]

这里是不是存在更好的解决方案来处理 Swift 中的这个 api 问题?

Swift - 坐标不可用:从 iOS 7 开始不推荐使用 API

Swift:确定自定义对象数组是不是包含特定字符串[重复]