2010-07-29 10 views
2

J'essaie de créer un binaire universel qui supporte le multitâche sur l'iPhone 4 et qui peut encore fonctionner sur l'iPad. Je sais comment éviter les erreurs de compilation pour différentes versions de l'IOS iPhone en vérifiant si une classe existe en utilisant NSClassFromString et "respondToSelector", mais existe-t-il un moyen de vérifier l'existence de constantes comme UIBackgroundTaskInvalid? Je peux bien sûr utiliser #IFDEF, mais je veux éviter cela.Comment tester l'existence d'une constante lors de la création d'un binaire universel iPhone

+0

Possible dupliquer: http://stackoverflow.com/questions/3056016/alternatives-to-weak-linking-in-iphone-sdk – iwasrobbed

Répondre

2

vous le faites comme suit:

if (NULL != &UIBackgroundTaskInvalid) { 
    //do multitasking stuff here 
} else { 
    // don't do multitasking stuff here. 
} 

Fondamentalement, vous voulez vérifier que l'adresse de cette variable existe.

Mise à jour: Pour être clair, vous ne pouvez pas vraiment utiliser un #ifdef pour cela puisque vous allez construire avec une version du SDK qui contient les symboles.

+2

@Elfred: vous gagnez ;-) mais cela ressemble à demander des ennuis. – mvds

+0

Dans le sélecteur "applicationDidEnterBackground" que je dois surcharger pour le multitâche, j'obtiens une erreur de compilation pour le "\t NSAssert (backgroundTask == UIBackgroundTaskInvalid, nil);" ligne. Évidemment, ce sélecteur ne sera pas appelé lors de l'exécution sur l'iPad, mais il ne compilera pas si je veux le tester en utilisant 3.2. Alors, quelle est la manière intelligente de faire cela? – Ken

+0

Vous construisez toujours avec le SDK iOS 4 et définissez la cible de déploiement à 3,2 – Elfred

1

Il suffit probablement de tester l'existence d'une méthode associée à la constante.

+0

Pas vraiment parce que ma constante doit toujours apparaître dans le code et ne passera pas le test du compilateur. – Ken

+1

Oui, tant que vous compilez avec BaseSDK 4.0, toutes les constantes 4.0 seront définies, mais vous ne devriez pas les utiliser sur les périphériques <4.0 (les liens faibles ne seront pas résolus lors de l'exécution sur ces périphériques). – progrmr

1

La méthode préférée pour vérifier iOS multi-tâches est de voir si UIDevice répond à isMultitaskingSupported, comme ceci:

//---------------------------------------------------------------------- 
// returns YES if multitasking is available (iOS 4.0 or >) 
//---------------------------------------------------------------------- 
BOOL hasMultitasking() 
{ 
    UIDevice* device = [UIDevice currentDevice]; 
    if ([device respondsToSelector:@selector(isMultitaskingSupported)]) { 
     return [device isMultitaskingSupported]; 
    } 
    return NO; 
} 

Si multi-tâches est pris en charge, vous pouvez utiliser ces constantes liées multi-tâches, que vous devriez avoir faible liés à.