在"发布"模式下编译会导致CGRect < - > NSRect转换出错

Mat*_*oal 1 xcode cocoa

编译我在发布模式下的最后一次构建我得到一些错误,如:

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

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

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

CGRect rect = [[someObject window]frame];

现在我已经使用类似的功能纠正了每个错误NSRectToCGRect,NSRectFromCGRect但我很想知道为什么只在发布模式下发生这种情况.

Pet*_*sey 9

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

CGRect rect = [someObject window]frame];
Run Code Online (Sandbox Code Playgroud)

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

更重要的是:

passing 'NSRect' (aka 'struct _NSRect') to parameter of incompatible type 'CGRect' (aka 'struct CGRect')
Run Code Online (Sandbox Code Playgroud)

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

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

试试这个:将运行目标更改为"My 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位上也是如此.