Je commencerais par apprendre le C. J'ai appris le C (et fait beaucoup de choses en C) avant de passer à Obj-C. J'ai de nombreux collègues qui n'ont jamais été de vrais programmeurs C, ils ont commencé avec Obj-C et n'ont appris que la quantité de C nécessaire.
De temps en temps, je vois comment ils résolvent un problème entièrement en Obj-C, ce qui aboutit parfois à des solutions très maladroites. Habituellement, je remplace alors du code Obj-C par du code C pur (après tout, vous pouvez les mélanger autant que vous le souhaitez, le contenu d'une méthode Obj-C peut être entièrement du code C pur). Sans vouloir insulter les programmeurs Obj-C, il y a des solutions qui sont très élégantes en Obj-C, ce sont des solutions qui fonctionnent (et ont l'air) bien mieux grâce à objets (La programmation OOP peut rendre les programmes complexes beaucoup plus beaux que la programmation fonctionnelle ; le polymorphisme par exemple est une caractéristique brillante)... et j'aime vraiment Obj-C (beaucoup plus que C++ ! Je déteste la syntaxe C++ et certaines caractéristiques du langage sont tout simplement exagérées et conduisent à de mauvais modèles de développement) ; cependant, lorsque je réécris parfois le code Obj-C de mes collègues (et je ne le fais vraiment que si je pense que c'est absolument nécessaire), le code résultant est généralement 50% plus petit, ne nécessite que 25% de la mémoire qu'il utilisait auparavant et est environ 400% plus rapide à l'exécution.
Ce que j'essaie de dire ici : Chaque langage a ses avantages et ses inconvénients. C a des avantages et des inconvénients et Obj-C en a aussi. Cependant, la caractéristique vraiment géniale d'Obj-C (c'est pourquoi je l'aime même plus que Java) est que vous pouvez passer au C simple à volonté et revenir. Pourquoi cette caractéristique est-elle si importante ? Parce que, tout comme Obj-C corrige plusieurs des inconvénients du C pur, le C pur peut corriger certains des inconvénients d'Obj-C. Si vous mélangez les deux, vous obtiendrez un meilleur résultat. Si vous les mélangez ensemble, vous obtiendrez une équipe très puissante.
Si vous n'apprenez qu'Obj-C et que vous n'avez aucune idée de ce qu'est le C, ou si vous n'en connaissez que les bases et n'avez jamais essayé de voir comment il peut résoudre élégamment certains problèmes courants, vous n'avez en fait appris que la moitié d'Obj-C. Le C est une partie fondamentale d'Obj-C. La possibilité d'utiliser le C à tout moment et partout est une caractéristique fondamentale de ce dernier.
Un exemple typique était un code que nous utilisions et qui devait encoder des données en base64, mais nous ne pouvions pas utiliser une bibliothèque externe pour cela (pas de librairie OpenSSL). Nous avons utilisé un encodeur base64, entièrement écrit à l'aide de classes Cocoa. Il fonctionnait bien, mais lorsque nous lui avons fait coder 200 Mo de données binaires, cela a pris une éternité et l'overhead mémoire était inacceptable. Je l'ai remplacé par un minuscule encodeur base64 ultra compact écrit entièrement comme une fonction C (j'ai copié le corps de la fonction dans le corps de la méthode, la méthode prenait NSData en entrée et renvoyait NSString en sortie, mais à l'intérieur de la fonction tout était en C). L'encodeur C était tellement plus compact, il a battu l'encodeur Cocoa pur par un facteur 8 en vitesse et l'overhead mémoire était aussi beaucoup moins important. Encoder/décoder des données, jouer avec des bits et d'autres tâches de bas niveau similaires sont les points forts du C.
Un autre exemple était un code d'interface utilisateur qui dessinait beaucoup de graphiques. Pour stocker les données nécessaires à la représentation des graphiques, nous avons utilisé des NSArray. En fait, il s'agissait de NSMutableArray, puisque le graphique était animé. Résultat : Animation du graphique très lente. Nous avons remplacé tous les NSArray par des tableaux C normaux, les objets par des structs (après tout, les informations sur les coordonnées du graphique ne sont pas indispensables dans les objets), l'accès aux énumérateurs par de simples boucles for et nous avons commencé à déplacer les données entre les tableaux avec memcopy au lieu de les prendre d'un tableau à l'autre, index pour index. Le résultat : Une vitesse multipliée par 4. Le graphique s'est animé de manière fluide, même sur les vieux systèmes PPC.
La faiblesse du C est que tout programme plus complexe devient laid à long terme. Maintenir des applications C lisibles, extensibles et gérables exige beaucoup de discipline de la part d'un programmeur. De nombreux projets échouent parce que cette discipline fait défaut. Obj-C vous permet de structurer facilement votre application en utilisant des classes, l'héritage, les protocoles, etc. Cela dit, je n'utiliserais pas de fonctionnalité purement C au-delà des limites d'une méthode, à moins que cela ne soit nécessaire. Je préfère garder tout le code d'une application Objective-C dans la méthode d'un objet ; tout le reste va à l'encontre de l'objectif d'une application OO. Cependant, à l'intérieur de la méthode, il m'arrive d'utiliser exclusivement du C pur.