使用CGFloat和float有什么区别?

167 iphone cocoa-touch objective-c

我倾向于在整个地方使用CGFloat,但我想知道我是否会因此而受到无意义的"性能打击".CGFloat似乎比浮动更"重",对吧?我应该在哪些方面使用CGFloat,真正的区别是什么?

Qui*_*lor 188

正如@weichsel所说,CGFloat只是一个float或两个的typedef double.您可以通过命令双击Xcode中的"CGFloat"来自行查看 - 它将跳转到定义了typedef的CGBase.h头文件中.同样的方法也用于NSInteger和NSUInteger.

引入这些类型是为了更容易编写无需修改即可在32位和64位上运行的代码.但是,如果你需要的只是float你自己的代码中的精确度,你仍然可以使用 - float如果你喜欢 - 它会在一定程度上减少你的内存占用.整数值也是如此.

我建议你投资,使您的应用程序64位清洁和尝试运行它是这样要求的适度的时间,因为大多数Mac现在有64位CPU和Snow Leopard完全64位,包括内核和用户应用程序.Apple的64位Cocoa过渡指南是一个有用的资源.

  • 我没有说过永远不要直接使用原语.有时候直接原语可能会有问题,例如,如果变量可能被用于存储可能溢出的数据,例如64位.通常,使用依赖于体系结构的typedef更安全,因为代码不太可能在不同的体系结构上爆炸.但是,有时使用32位类型可以完全安全并节省内存.原语的大小在JVM中可能不是问题,但是Obj-C和C被编译,并且混合32位和64位库和代码确实存在问题. (9认同)
  • 在我们知道的iPhone上,没有.但是,面向未来的代码总是明智的,这样可以更容易地为OS X安全地重用相同的代码. (4认同)

Tho*_*ing 73

CGFloat是32位系统上的常规浮点数,是64位系统上的双倍浮点数

typedef float CGFloat;// 32-bit
typedef double CGFloat;// 64-bit
Run Code Online (Sandbox Code Playgroud)

所以你不会受到任何性能损失.

  • 输入:iPhone 5S (23认同)
  • 正确,iPhone OS是32位.如果你考虑一下,iPhone并没有推动32位的4GB RAM限制,也没有使用英特尔处理器(64位比32位更快).此外,它使用的是Modern Runtime(而不是桌面上的32位传统运行时 - 如果你很好奇,我们会对这些术语进行操作)因此它基本上可以完成64位OS X所能做到的一切.也许有一天我们会看到一个运行iPhone OS并且是64位的设备,但目前还没有. (13认同)
  • 但是只有64位. (8认同)
  • 5S现在是64位,上次我进入会议(伦敦),他们说他们在ios7上运行32位应用程序的方式是在内存中启动另一个共享缓存池,这可能导致整体使用更多内存.所以它的def值可以将所有内容转换为64位.(除非你想支持5.1+或6.0+) (7认同)
  • 好吧,如果你担心记忆,你会使用两倍的内存. (3认同)