Apprendre Objective-C Jour 3

Bienvenue dans la troisième partie de cette série. J'espère que vous l'appréciez! La semaine dernière, nous avons examiné la manière dont nous séparons les classes dans des fichiers distincts (interface et implémentation). Cette semaine, nous allons examiner à nouveau les classes, mais un peu plus en profondeur. Nous allons également prendre un pic à l'héritage et comment cela fonctionne, avec une portée variable.

Jusqu'à présent, nous avons eu d'excellents commentaires par e-mail, Twitter et des commentaires. C’est formidable de voir autant de personnes s’intéresser à ce sujet et c’est encore mieux de voir que tant d’entre vous l’essaient et posent de bonnes questions. Continuez!

En revue: Classes & Objets

Passons en revue ce que nous avons appris sur les classes de cette série jusqu'à présent. Si vous ne savez rien de cela, n'hésitez pas à revenir au dernier tutoriel à réorganiser. Ok, alors, quelles sont les classes?

Une classe est un ensemble de données encapsulées et de méthodes personnalisées. Une classe peut contenir de nombreux types de données différents et les méthodes de classe effectuent généralement (mais pas toujours) des actions liées à ces données. En Objective-C, une classe est généralement composée de deux fichiers: un fichier d'interface et un fichier d'implémentation. Le fichier d'interface utilise l'extension de fichier .h par convention et permet à l'utilisateur utilisant la classe de trouver rapidement les méthodes et les membres de données disponibles pour la classe. Le fichier d'implémentation utilise l'extension de fichier .m par convention. C'est là que réside la majorité du code car il contient l'implémentation réelle de toutes les fonctions déclarées dans l'interface..

Alors, qu'est-ce qui distingue une classe d'un objet? Qu'est-ce qu'un objet? Un objet est une instance d'une classe. Repensez à notre exemple avec la voiture dans la dernière partie de la série. Où voiture est la classe, alors ma voiture, dansCar, et ta voiture seraient tous des objets parce qu'ils sont des instances de la classe de voiture.

Cours d'Apple (et un peu d'histoire)

Avant de poursuivre, je voudrais partager quelques-unes des nombreuses classes courantes que vous utiliserez, fournies par Apple, mais tout d’abord, une petite leçon d’histoire..

De nombreuses classes fournies par Apple sont précédées de l'abréviation «NS», qui signifie NextStep. Lorsque Steve Jobs a quitté Apple, il a fondé NeXT, créant des ordinateurs de poste de travail fonctionnant sous son système d'exploitation. Le langage de programmation orienté objet utilisé sur ces machines s'appelait NeXTSTEP, d'où nous obtenons le «NS». Quand Apple a acquis NeXTSTEP (une autre leçon d'histoire en soi), ils ont décidé de baser Mac OS X sur NeXTSTEP..

Voici quelques classes simples et communes que nous verrons beaucoup:

  • NSString est une chaîne de texte immuable.
  • NSMutableString est une chaîne de texte mutable.
  • NSArray est un tableau d'objets immuable.
  • NSMutableArray est un tableau d'objets qui est mutable.
  • NSNumber détient une valeur numérique.

Nous en apprendrons beaucoup d'autres plus tard, mais pour l'instant, ce qui précède nous sera utile. Vous vous demandez probablement ce que signifie mutable et immuable, ce qui est une question tout à fait raisonnable. Si un objet est immuable cela signifie que lorsque nous créons un objet et lui attribuons une valeur, il est statique. La valeur ne peut pas être modifiée. Si un objet est mutable alors il est dynamique, ce qui signifie que la valeur peut être modifiée après la création.

Pointeurs et initialisation

Supposons que nous voulions créer une chaîne de texte statique et la consigner, comment procéderions-nous? Dans notre code, cela ressemblerait à quelque chose comme ça:

 #importation  int main (int argc, const char * argv []) NSString * testString; testString = [[NSString alloc] init]; testString = @ "Voici une chaîne de test dans testString!"; NSLog (@ "testString:% @", testString); retourne 0;  

J'ai créé ce fichier en XCode en allant à Fichier> Nouveau projet> Mac OS X> Application> Outil de ligne de commande> Type: Fondation (tout un voyage!) et éditer le fichier d'implémentation (extension: .m) dans le projet.

Il y a pas mal de choses nouvelles ici, alors examinons ce qui précède pièce par pièce.

Tout d’abord, nous importons la bibliothèque de la fondation (c’est parce que nous avons précédemment défini le type sur Fondation dans la nouvelle fenêtre du projet)..

 int main (int argc, const char * argv [])  

Ceci déclare la fonction initiale qui sera appelée lorsque notre programme commencera à s'exécuter. Les deux paramètres séparés par une virgule permettent de transmettre des arguments à notre application. Pour l'instant, ne vous inquiétez pas pour cela, nous n'en aurons pas besoin maintenant..

 NSString * testString; testString = [[NSString alloc] init]; 

Nous créons maintenant un pointeur sur un objet NSString appelé testString. Une fois que la première ligne est terminée, aucune chaîne n'existe encore, seulement un pointeur sur une chaîne que nous n'avons pas encore créée. Sur la ligne suivante, nous créons la chaîne sur laquelle pointe notre pointeur.

Nous aurions pu alternativement écrire la dernière ligne comme ceci;

 testString = [NSString alloc]; [testString init]; 

Cela peut sembler un peu déroutant au début. Dans la première version, nous avons imbriqué les instructions entre parenthèses sur la même ligne, tandis que dans la seconde, nous les avons séparées en deux lignes. La méthode init initialise toutes les variables d'instance de la classe..

 testString = @ "Voici une chaîne de test dans testString!"; 

Cette ligne est assez explicite, la raison pour laquelle nous précédons les guillemets d'un signe @ est d'indiquer au compilateur que le texte suivant est une chaîne NSString.

NSLog (@ "testString:% @", testString);

Ici, nous enregistrons des informations sur la console. XCode a un débogueur intégré que vous pouvez trouver dans le menu Exécuter. Il est très utile lors du développement d’une application d’enregistrer les événements et les valeurs de certaines variables. Cela peut aider lors du dépannage de votre application et des problèmes de débogage. Cette méthode fonctionne comme printf (rappelez-vous de la première semaine?) Où nous fournissons une chaîne de texte avec un caractère de remplacement (% @ signifie un objet Objective-C).

Enfin, nous retournons 0, qui, nous le savons, indique simplement au système d'exploitation que l'application s'est terminée sans problème.

Héritage

Rappelez-vous que lorsque nous avons créé notre NSString plus tôt, nous avons utilisé la méthode init? Eh bien NSMutableString, NSArray et, en fait, chaque classe NS utilise également init. Semble beaucoup de code gaspillé pour mettre la méthode init dans chaque classe, non? Ce serait le cas, c'est pourquoi init n'est généralement implémenté qu'une seule fois, dans la classe racine appelée NSObject. Comme les classes héritent les unes des autres, classe créée en tant qu'enfant d'un autre, la classe parent obtiendra automatiquement l'accès aux méthodes de la classe parent..

Prenons NSMutableString par exemple. NSMutableString a NSString pour un parent (ce qui en fait un enfant), ce qui signifie qu'il hérite de NSString. Pendant ce temps. NSString a NSObject comme parent, donc il hérite de NSObject.

Ainsi, par exemple, NSObject a une méthode appelée init, de sorte que chaque sous-classe a cette méthode implémentée - appelée méthode de classe. En fait, la méthode init dans NSObject ne fait rien, elle retourne simplement self. La raison en est que les méthodes peuvent être écrasées. Ainsi, la classe NSArray peut remplacer l’init dont elle hérite pour y ajouter des fonctionnalités, par exemple s’assurer que la mémoire est disponible ou préparer toutes les variables d’instance dont elle pourrait avoir besoin..

Comme démontré, cela est utile car cela signifie qu'en plus d'hériter de classes, nous pouvons également étendre les classes. Lorsque nous étendons une classe, nous prenons une classe existante et ajoutons des fonctionnalités supplémentaires à ce qui est déjà disponible. Cela signifie que vous pouvez créer votre propre version de NSString avec des méthodes supplémentaires, telles qu'une méthode permettant de remplir la chaîne avec du texte aléatoire ou d'effectuer une sorte de codage de caractères..

Résumé

À ce stade, les bases du fonctionnement des classes devraient être claires. Pour tester votre compréhension, voyez si vous pouvez répondre aux questions suivantes dans votre esprit:

  • Quelle est la différence entre une classe et un objet?
  • Pourquoi utilisons-nous des cours??
  • Pourquoi l'héritage est-il utile??

Étant donné que les cours constituent une partie si importante d’Objective-C, il est important de travailler à l'aise avec eux. La semaine dernière, nous avons commencé à examiner les cours et cette semaine, nous sommes allés plus en profondeur. La semaine prochaine, vous serez peut-être heureux d'apprendre que nous allons nous éloigner du côté théorique et commencer à travailler sur notre propre classe simple ou sur deux pour effectuer des tâches simples..

Devoirs

Depuis que nous avons principalement fait de la théorie jusqu’à présent, votre travail cette semaine consiste à surfer sur le site Web du développeur d’Apple (vous auriez dû le faire la semaine dernière) et à regarder certains des cours disponibles. Si vous ne savez pas par où commencer, commencez par quelque chose comme NSString. Vous serez plus à l'aise avec les détails de la classe parente, des méthodes, etc. Cela sera important ultérieurement lorsque vous utilisez des classes en dehors de cette série et que vous voulez savoir quelles méthodes elles héritent ou utilisent..

La prochaine fois

Nous aurons plus pratique la semaine prochaine avec un codage de classe. Les classes sont vraiment au cœur d’Objective-C, il est donc primordial que vous les maîtrisiez et le but de cette série est de vous assurer de le faire.!

Comme d'habitude, si vous avez des questions ou des commentaires, vous pouvez me joindre en laissant un commentaire ou un courriel. Si vous souhaitez me contacter personnellement et obtenir une réponse rapide, envoyez-moi un tweet!