在“发布”模式下编译会导致CGRect< - >的错误NSRect转换

时间:2011-10-11 16:52:45

标签: xcode cocoa

在发布模式下编译我的上一次构建时出现了一些错误:

passing 'NSRect' (aka 'struct _NSRect') to parameter of incompatible type 'CGRect' (aka 'struct CGRect')

确实,我使用NSRect作为CGRect,反之亦然,但我没有在调试模式下得到这些错误。

例如,这会产生错误(不在调试模式下):

CGRect rect = [[someObject window]frame];

现在我已经使用NSRectToCGRectNSRectFromCGRect这样的功能纠正了每个错误,但我很想知道为什么这只会在发布模式下发生。

1 个答案:

答案 0 :(得分:9)

  

例如,这会产生错误(不在调试模式下):

CGRect rect = [someObject window]frame];

嗯,那是因为那是无效的代码。你错过了[

更重要的是:

passing 'NSRect' (aka 'struct _NSRect') to parameter of incompatible type 'CGRect' (aka 'struct CGRect')
     

确实如此,我使用NSRect作为CGRect,反之亦然,但我没有在调试模式下得到这些错误。

默认情况下,Debug配置仅构建活动体系结构,这是当前运行目标的体系结构(Scheme弹出窗口的右半部分,假设您使用的是Xcode 4)。如果将其设置为“我的Mac 64位”,那就是它始终有效的原因。

尝试此操作:将运行目标更改为“我的Mac 32 -bit”,然后尝试运行。

请参阅?

在64位Mac OS X中,NSRect被定义为CGRect,这就是您可以在它们之间自由转换的方式。在32位Mac OS X中,NSRect是单独定义的,因此您不能只从一种值类型转换为另一种值类型。它们的定义是相同的,所以你可以做指针别名或通过一个联合,它可以工作,但你不能只是隐式或显式地转换,因为它们是独立的,无关的定义。

有两种解决方案:

  • 从您的应用中删除对32位的支持。将所有配置中的架构设置为“标准Intel 64位”。
  • 在前缀标头或预处理器宏构建设置中,将NS_BUILD_32_LIKE_64宏定义为1。当将其定义为真值时,NSRect将被定义为CGRect(以及其他几何类型),即使在32位上也是如此。