Bonnes feuilles : Développer pour l'Iphone et l'Ipad Information sur le système

développer pour l'iphone et l'ipad a été publié aux éditions dunod (collection
Développer pour l'Iphone et l'Ipad a été publié aux éditions Dunod (collection InfoPro). © Dunod

Plutôt que de tester des numéros de version et des noms de périphérique, le meilleur moyen pour savoir si une fonction est disponible ou non avec le système en cours d'exécution est de lui demander !

Le système supportet-il certaines instructions ?

Deux appels d'Objective-C permettent d'obtenir une réponse sans aucune ambiguïté :
NSClassFromString et respondsToSelector:.

La fonction NSClassFromString retourne l'objet représentant la classe dont le nom est passé en paramètre. Si cette classe n'existe pas dans le système, cette fonction retourne nil. Ainsi, si l'on souhaite tester l'existence d'une classe, on peut utiliser les instructions suivantes :

 if (NSClassFromString(@"UISplitViewController")) {
// UISplitViewController existe
}

Nous avons vu, au paragraphe 2.2.5, que certaines bibliothèques peuvent être liées faiblement (weak linked) à l'application. Il s'agit des fonctionnalités apparues entre la version de déploiement et la version de base. Pour être sûr que le code de l'application ne soit pas rejeté au moment de l'exécution, il faut éviter de référencer explicitement
les classes concernées. On les référence indirectement par le résultat de la fonction NSClassFromString :

 popoverController = [[NSClassFromString
(@"UIPopoverController") alloc]
initWithContentViewController:vc];


Si les références à une de ces classes sont nombreuses, on peut éventuellement créer une variable qui contient la représentation de cette classe :

Class pcController = NSClassFromString
(@"UIPopoverController");
popoverController = [[pcController alloc]
initWithContentViewController:vc];


L'autre réponse sans ambiguïté est la méthode respondsToSelector:. Celle-ci retourne YES si l'instance qui reçoit ce message peut répondre au sélecteur passé en paramètre. Ainsi, la version 3.2 introduit la méthode distanceFromLocation: pour la classe CLLocation. Pour savoir si cette méthode est disponible avec le système en cours d'exécution, on peut utiliser les instructions suivantes :

 if ([location respondsToSelector:@selector
(distanceFromLocation:)]) {
// La méthode distanceFromLocation:
est disponible pour l'instance location
}