在 Release模式下编译我的最后一个版本时,我收到一些错误,例如:
将“NSRect”(又名“struct _NSRect”)传递给不兼容类型“CGRect”(又名“struct CGRect”)的参数
确实如此,我使用 NSRect 作为 CGRect,反之亦然,但我在 Debug模式下没有收到这些错误。
例如,这会产生错误(不在 Debug模式下):
CGRect 矩形 = [[someObject 窗口]frame];
现在我已经使用 NSRectToCGRect
和 NSRectFromCGRect
等函数纠正了所有错误,但我很好奇为什么这种情况只发生在 Release模式下。
最佳答案
For example, this like produces an error (not in Debug mode):
CGRect rect = [someObject window]frame];
嗯,那是因为那是无效代码。您缺少 [
。
更重要的是:
passing 'NSRect' (aka 'struct _NSRect') to parameter of incompatible type 'CGRect' (aka 'struct CGRect')
It is true, i'm using NSRect as CGRect and vice versa but i don't get these errors in Debug mode.
默认情况下,调试配置仅构建事件架构,即当前运行目标的架构(方案弹出窗口的右半部分,假设您使用的是 Xcode 4)。如果将其设置为“我的 Mac 64 位”,这就是它始终有效的原因。
试试这个:将运行目标更改为“My Mac 32-bit”,然后尝试运行。
看到了吗?
在 64 位 Mac OS X 中,NSRect
被定义为 CGRect
,这样您就可以在它们之间自由转换。在 32 位 Mac OS X 中,NSRect
是单独定义的,因此您不能只从一种值类型转换为另一种值类型。它们的定义相同,因此您可以使用指针别名或通过联合,它会起作用,但您不能只是隐式或显式地进行强制转换,因为它们是单独的、不相关的定义。
有两种解决方案:
- 从您的应用中删除对 32 位的支持。将所有配置中的架构设置为“标准 Intel 64 位”。
- 在前缀 header 或预处理器宏build设置中,将
NS_BUILD_32_LIKE_64
宏定义为1
。当将此值定义为真值时,NSRect
将被定义为CGRect
(以及其他几何类型),即使在 32 位上也是如此。
关于xcode - 在 "Release"模式下编译会导致 CGRect <-> NSRect 转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7729625/