2010-09-18 4 views
15

Tại sao mã này không hoạt động khi biên soạn một gói thử nghiệm đơn vị ApplicationTests?TARGET_OS_IPHONE và ApplicationTests

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

Một trong những phụ thuộc của tôi có việc kiểm tra này và biên dịch tốt trong bó ứng dụng chính của tôi, nhưng nó cố gắng để tải <Cocoa/Cocoa.h> khi biên dịch ApplicationTests bó của tôi. Nó có lẽ chỉ là sự thiếu hiểu biết của tôi về XCode, nhưng tôi lo lắng khi các gói thử nghiệm của tôi không xây dựng. Bất kỳ đề xuất?

+0

chỉ để thêm, bạn không cần nhập nền tảng nếu bạn nhập uikit – Ondrej

+0

có thể không phải bây giờ, nhưng 5 năm trước? có lẽ. –

+0

Có thể là 5 năm trước khi tất cả các thành phần trong UIKit đến từ NSObject => Khuôn khổ nền tảng – Ondrej

Trả lời

11

Tôi gặp sự cố tương tự: TARGET_OS_IPHONE không được xác định khi xây dựng thư viện tĩnh. Giải pháp của tôi là thêm "-DTARGET_OS_IPHONE" vào phần "Other C Flags" của tùy chọn xây dựng mục tiêu.

+0

Yup, điều này đã kết thúc. Tôi không chắc làm thế nào tôi cảm thấy phải ép buộc điều này là đúng, nhưng tôi đoán nó hoạt động. Cảm ơn. –

+0

@MattBaker - Cùng một vấn đề ở đây và tôi đồng ý! –

+5

Điều đó nghe giống như giải pháp sai. Bạn nên làm như antho được đề xuất dưới đây và bao gồm TargetConditionals.h. Tài liệu ở đây: http://developer.apple.com/library/ios/#DOCUMENTATION/Xcode/Conceptual/ios_development_workflow/15-Configuring_Applications/configuring_applications.html –

0

Nó không áp đặt hình phạt hiệu quả, mặc dù nó có thể làm hại biên dịch lần. Điều đó nói rằng, nó không thực sự là một vấn đề cho Objective C. Tuy nhiên, nó thực sự có thể bị tổn thương khi giao dịch với các lớp C++.

9

Giải pháp đơn giản nhất là để di chuyển các tuyên bố #import <Foundation/Foundation.h> ra nếu điều kiện #if và thay thế Cocoa với AppKit như thế này:

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

Các ô tiêu đề Foundation nhập tiêu đề NSObjCRuntime do đó nhập khẩu các TargetConditionals tiêu đề.

+2

Brilliant! Điều này thực sự cần được chấp nhận câu trả lời! –