2010-09-18 21 views
15

爲什麼編譯ApplicationTests單元測試包時此代碼不工作?TARGET_OS_IPHONE和ApplicationTests

#if TARGET_OS_IPHONE 
    #import <Foundation/Foundation.h> 
    #import <UIKit/UIKit.h> 
#else 
    #import <Cocoa/Cocoa.h> 
#endif 

我的一個依賴有這樣的檢查,在編譯我的主要應用包得很好,但它試圖編譯我ApplicationTests束時加載<Cocoa/Cocoa.h>。這可能只是我對XCode的理解不夠,但是當我的測試包不能構建時,我會感到緊張。有什麼建議麼?

+0

剛剛添加,你不需要導入基礎,如果你導入uikit – Ondrej 2015-02-06 10:54:22

+0

也許不是現在,但5年前?也許。 – 2015-02-06 12:58:08

+0

也許甚至在5年前,因爲UIKit中的所有元素都來自NSObject => Foundation框架 – Ondrej 2015-02-06 13:44:07

回答

11

我有一個類似的問題:TARGET_OS_IPHONE未建立靜態庫時定義。我的解決方案是將「-DTARGET_OS_IPHONE」添加到目標構建選項的「Other C Flags」部分。

+0

是的,這最終導致了工作。我不確定我是如何強迫這是真實的,但我想它是有效的。謝謝。 – 2010-09-20 22:43:18

+0

@MattBaker - 同樣的問題在這裏,我同意! – 2012-06-25 22:13:48

+5

這聽起來像是錯誤的解決方案。你應該像下面建議的antho那樣做,並且包含TargetConditionals.h。記錄在這裏:http://developer.apple.com/library/ios/#DOCUMENTATION/Xcode/Conceptual/ios_development_workflow/15-Configuring_Applications/configuring_applications.html – 2012-09-04 16:53:51

0

它規定沒有性能損失,雖然它可以傷害編譯時間。也就是說,對於Objective C來說這不是真正的問題。但是,在處理C++類時它確實會受到傷害。

9

最簡單的解決方案是用了AppKit移動#import <Foundation/Foundation.h>陳述出來,如果#if,並更換可可這樣的:

#import <Foundation/Foundation.h> 
#if TARGET_OS_IPHONE 
    #import <UIKit/UIKit.h> 
#else 
    #import <AppKit/AppKit.h> 
#endif 

基金會傘頭進口NSObjCRuntime頭這反過來進口TargetConditionals頭。

+2

輝煌!這其實應該被接受的答案! – 2015-11-10 05:01:36

相關問題