Si l’on doutait encore de l’impact commercial des iDevices (comprendre iPhone, iPad et autre iPod touch), il suffit de regarder l’index Tiobe pour s’apercevoir que, si avant 2007 l’objective-C était méconnu des développeurs, celui-ci est maintenant passé à la 3e place des langages populaires devant le C et le C#.
Bien qu’avec le C , les deux langages soient d’un âge relativement similaire, l’objective-C est longtemps resté dans l’ombre. Jusqu’à il y a peu, seule une poignée de développeurs aficionados en connaissaient l’existence, et moins encore en connaissaient la syntaxe. Les langages informatiques, comme tout langage, évoluent au fil du temps. Et ce qui est vrai en langues humaines l’est aussi en informatique : plus un langage est utilisé, plus son évolution est rapide! Autant dire donc que l’objective-C a peu évolué entre 1970 et l’année 2007 où l’iPhone l’entraina sous le feu des projecteurs…
Par nature, l’objective-C reprend entièrement le langage C et lui ajoute les notions de classe et d’objet, où chaque objet est stocké en mémoire et est accessible via un pointeur. Les méthodes (appelées messages) peuvent ainsi être envoyées à l’objet via son pointeur en utilisant une syntaxe à la smalltalk. La «fameuse» syntaxe à la smalltalk, dont le monde a entièrement oublié l’existence! C’est cette syntaxe particulière, choix stratégique et certainement justifiable en 1980, qui est de nos jours le plus couteuse en matière d’apprentissage du langage. Depuis l’an 2000, le JAVA s’est imposé comme standard de facto pour la programmation orientée objet. C’est le langage qui est maintenant appris dans les écoles, son usage est plus répandu que celui du C, et sa syntaxe pour l’appel de méthodes (la syntaxe pointée, communément appelée dotSyntax), a été reprise par tous les langages modernes: C#, PHP, JavaScript, Ruby… L’objective-C fait ainsi figure d’alien face à une communauté de développeurs jeunes ayant appris les bases de la programmation en acceptant dotSyntax comme convention universelle.
La première évolution sérieuse du langage survint en 2006, quelques mois avant la sortie de l’iPhone, dans un contexte où le mac commençait à séduire un nombre croissant d’utilisateurs. Cette évolution, baptisée objective-C 2.0, introduisit en partie la dotSyntax, la génération automatisée des accesseurs, l’énumération rapide (communément appelée for….each), les extensions de classe et la possibilité d’inclure des méthodes optionnelles dans les protocoles grâce à des mécanismes d’introspection (permettant entre autres de tester si une instance implémente une méthode).
La deuxième grande évolution de l’objective-C, promue par Apple Inc. sous le nom « Modern Objective-C », ne remonte pas plus loin que septembre 2012 et dote le langage de fonctionnalités inspirées du java pour la manipulation des collections et des nombres.
Les développeurs ont souvent besoin de saisir des chaines de caractères en dur dans leur code et en objective-C, cette fonctionnalité est, depuis longtemps, aisément disponible grâce au préfixe @. Ainsi la création d’une variable contenant la chaîne de caractères « toto », pouvait s’écrire de façon simple:
NSString * str = @"toto";
au lieu d’appeler les méthodes constructeurs classiques
NSString * str = [NSString stringWithUTF8String:"toto"];
Si ce raccourci est disponible pour les strings, il n’en était rien pour les collections, ainsi créer de manière littérale une collection requérait d’écrire:
NSArray * array = [NSArray arrayWithObjects:object1, object2, nil];
Maintenant, le même résultat peut s’obtenir via la syntaxe simplifiée
NSArray * array = @[object1, object2];
et il en va de même pour les tableaux associatifs (NSDictionnary) désormais instanciable via la syntaxe
NSDictionary * dictionary = @{clef1:object1, clef2:object2};
Sur la même logique, la méthode permettant de créer un objet NSNumber à partir d’un nombre littéral est simplifiée avec la syntaxe @YES, @2, @34f … remplaçant les traditionnels:
[NSNumber numberWithBool:YES];
[NSNumber numberWithInt:2];
[NSNumber numberWithFloat:34f];
Cette technique appelée boxing (consistant donc à mettre dans une « boîte » objet, une valeur primitive telle qu’un entier ou une valeur logique) que java 1.5 a rendu transparente pour le développeur ne l’était pas encore en objective-C, voila qui est fait. Notons aussi que, si on souhaite « mettre en boite » le résultat d’un calcul , il est possible d’utiliser directement la syntaxe @( expression).
Le dernier point de modernisation concerne l’accès à l’un des éléments d’un tableau. Il y a encore un an, le développeur devait appeler sur ses collections les méthodes suivantes:
id object = [myArray objectAtIndex:3];
id object = [myDictionary objectForKey:@"toto"];
Il pourra à présent obtenir les mêmes résultats avec::
id object = myArray[3];
id object = myDictionary[@"toto"];
Ces petites améliorations font partie de l’évolution normale d’un langage vivant (rappelons qu’il a fallu attendre 2004 pour que le langage Java apporte l’énumération rapide et le boxing automatique) et s’il reste encore quelques points à améliorer (comme l’unboxing ou, plus vitale encore, la simplification de la technique de concaténation de chaines de caractère) je les salue avec plaisir. Ce sont de petites choses mais elles contribuent à rendre l’Objective-C plus lisible, plus agréable à programmer et permettent de passer moins de temps sur de petits détails techniques afin de se concentrer sur le coeur de métier du développeur: « Créer de superbes Apps ».