编译我在发布模式下的最后一次构建我得到一些错误,如:
passing 'NSRect' (aka 'struct _NSRect') to parameter of incompatible type 'CGRect' (aka 'struct CGRect')
确实,我使用NSRect作为CGRect,反之亦然,但我没有在调试模式下得到这些错误.
例如,这会产生错误(不在调试模式下):
CGRect rect = [[someObject window]frame];
现在我已经使用类似的功能纠正了每个错误NSRectToCGRect
,NSRectFromCGRect
但我很想知道为什么只在发布模式下发生这种情况.
例如,这会产生错误(不在调试模式下):
Run Code Online (Sandbox Code Playgroud)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')
确实,我使用NSRect作为CGRect,反之亦然,但我没有在调试模式下得到这些错误.
默认情况下,Debug配置仅构建活动体系结构,这是当前运行目标的体系结构(Scheme弹出窗口的右半部分,假设您使用的是Xcode 4).如果它被设置为"我的Mac 64位",那就是它始终有效的原因.
试试这个:将运行目标更改为"My Mac 32- bit",然后尝试运行.
看到?
在64位Mac OS X中,NSRect
定义为CGRect
,您可以在它们之间自由转换.在32位Mac OS X中,NSRect
是单独定义的,因此您不能只从一种值类型转换为另一种值类型.它们的定义是相同的,所以你可以做指针别名或通过一个联合,它可以工作,但你不能只是隐式或显式地转换,因为它们是独立的,无关的定义.
有两种解决方案:
NS_BUILD_32_LIKE_64
宏定义为1
.当NSRect
将其定义为真值时,将定义为CGRect
(以及其他几何类型),即使在32位上也是如此.