在发布模式下编译我的上一次构建时出现了一些错误:
passing 'NSRect' (aka 'struct _NSRect') to parameter of incompatible type 'CGRect' (aka 'struct CGRect')
确实,我使用NSRect作为CGRect,反之亦然,但我没有在调试模式下得到这些错误。
例如,这会产生错误(不在调试模式下):
CGRect rect = [[someObject window]frame];
现在我已经使用NSRectToCGRect
和NSRectFromCGRect
这样的功能纠正了每个错误,但我很想知道为什么这只会在发布模式下发生。
答案 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
是单独定义的,因此您不能只从一种值类型转换为另一种值类型。它们的定义是相同的,所以你可以做指针别名或通过一个联合,它可以工作,但你不能只是隐式或显式地转换,因为它们是独立的,无关的定义。
有两种解决方案:
NS_BUILD_32_LIKE_64
宏定义为1
。当将其定义为真值时,NSRect
将被定义为CGRect
(以及其他几何类型),即使在32位上也是如此。