2010-09-18 19 views
15

Pourquoi ce code ne fonctionne-t-il pas lors de la compilation d'un ensemble de tests unitaires ApplicationTests?TARGET_OS_IPHONE et ApplicationTests

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

Un de mes dépendances a ce contrôle et compile très bien dans mes principaux ensembles d'applications, mais il essaie de charger <Cocoa/Cocoa.h> lors de la compilation mon paquet de ApplicationTests. C'est probablement juste mon manque de compréhension de XCode, mais je suis nerveux quand mes bundles de test ne se construisent pas. Aucune suggestion?

+0

juste pour ajouter, vous n'avez pas besoin d'importer la base si vous importez uikit – Ondrej

+0

peut-être pas maintenant, mais il y a 5 ans? peut être. –

+0

Probablement même il y a 5 ans que tous les éléments de l'UIKit proviennent de NSObject => Foundation framework – Ondrej

Répondre

11

J'ai eu un problème similaire: TARGET_OS_IPHONE n'est pas défini lors de la construction d'une bibliothèque statique. Ma solution consistait à ajouter "-DTARGET_OS_IPHONE" à la section "Other C Flags" des options de construction cible.

+0

Yup, cela a fini par fonctionner. Je ne suis pas sûr de ce que je ressens d'avoir à forcer cela, mais je suppose que ça fonctionne. Merci. –

+0

@MattBaker - Même question ici et je suis d'accord! –

+5

Cela ressemble à la mauvaise solution. Vous devriez faire comme antho suggéré ci-dessous et inclure TargetConditionals.h. Documenté ici: http://developer.apple.com/library/ios/#DOCUMENTATION/Xcode/Conceptual/ios_development_workflow/15-Configuring_Applications/configuring_applications.html –

0

Il impose aucune pénalité de performance, même si elle peut nuire les temps de compilation. Cela dit, ce n'est pas vraiment un problème pour Objective C. Cependant, il peut vraiment faire mal quand il s'agit de classes C++.

9

La solution la plus simple consiste à déplacer la déclaration #import <Foundation/Foundation.h> si la condition #if et remplacer Cocoa avec AppKit comme ceci:

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

L'en-tête parapluie Fondation importe l'en-tête NSObjCRuntime qui importe à son tour l'en-tête TargetConditionals.

+2

Brillant! Cela devrait effectivement être accepté réponse! –