xcode - 在 "Release"模式下编译会导致 CGRect <-> NSRect 转换错误

标签 xcode cocoa

在 Release模式下编译我的最后一个版本时,我收到一些错误,例如:

将“NSRect”(又名“struct _NSRect”)传递给不兼容类型“CGRect”(又名“struct CGRect”)的参数

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

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

CGRect 矩形 = [[someObject 窗口]frame];

现在我已经使用 NSRectToCGRectNSRectFromCGRect 等函数纠正了所有错误,但我很好奇为什么这种情况只发生在 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/

相关文章:

objective-c - Objective-C 协议(protocol)的默认实现

objective-c - 如何使文本标签显示表格中有多少行

cocoa - Mac App Store 中是否允许绕过系统打印对话框的应用程序?

ios - 从 firebase 检索我的帖子并将其显示在我的 collectionView 单元格上? ios

ios - 阻止 webkit View 允许视频自动全屏显示?

Swift 相机应用程序 - 启用横向模式右/左

ios - 以编程方式将选项卡栏添加到 ViewController

xcode - Xcode 中此文件的 "M"是什么?

objective-c - 我可以从 C 函数调用 Objective-C 方法吗?

cocoa - 使用 MVVM 时处理 NSManagedObject