2011-10-11 51 views
1

在編制發佈模式我上次構建我得到這樣的一些錯誤:編譯「釋放」模式會導致錯誤的的CGRect <->的NSRect轉換

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

這是真的,我使用的NSRect作爲的CGRect和反之亦然,但我沒有在調試模式下得到這些錯誤。

例如,這就像產生一個錯誤(沒有在調試模式下):

CGRect rect = [[someObject window]frame];

現在我已經糾正了使用功能,每一個這樣的錯誤NSRectToCGRectNSRectFromCGRect,但我很好奇,想知道爲什麼這個僅在發佈模式下發生。

+0

編譯器的警告/錯誤標誌是不同的嗎? – zaph

+0

@CocoaFu只有這些PARAMS似乎型動物: 優化級別:調試(無)發佈(最快/最小) 符號默認是隱藏的:調試(無)發佈(是) – MatterGoal

回答

9

例如,這就像產生一個錯誤(沒有在調試模式下):

CGRect rect = [someObject window]frame]; 

嗯,那是因爲這是無效的代碼。您錯過了[

更重要的一點:

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

這是真的,我使用的NSRect作爲的CGRect,反之亦然,但我不明白在調試模式下這些錯誤。

默認情況下,Debug配置只有建立有效的體系結構,這是當前的運行目標的體系結構(該計劃彈出的右半邊,假設你使用的Xcode 4)。如果它設置爲「我的Mac 64位」,那就是它總是有效的原因。

嘗試此操作:將運行目標更改爲「我的Mac 位」,然後嘗試運行。

請參閱?

在64位Mac OS X中,NSRect定義爲CGRect,這是您如何在它們之間自由轉換的方式。在32位Mac OS X中,NSRect是單獨定義的,因此您不能只從一個值類型轉換到另一個值類型。它們的定義是相同的,所以你可以做指針別名或通過聯合,它會起作用,但你不能只隱式或明確地進行投射,因爲它們是單獨的,無關的定義。

解決辦法有兩個:

  • 從您的應用程序的32位跌落支持。將所有配置中的架構設置爲「標準英特爾64位」。
  • 在您的前綴頭文件或預處理器宏構建設置中,將NS_BUILD_32_LIKE_64宏定義爲1。當這被定義爲真值時,即使在32位上,NSRect也將被定義爲CGRect(以及其他幾何類型)。
+0

我委屈在編寫代碼問題(我現在糾正它加入'[')。 謝謝你關於32/64的其他內容,這正是發生的事情! – MatterGoal

+0

+1我不知道'NS_BUILD_32_LIKE_64'宏。 –

相關問題