Avant la pratique, un peu de théorie
En Objective-C, appeler une méthode de classe revient à envoyer un message. Pour cela, on utilise une syntaxe un peu particulière : le nom de l'objet est placé entre crochets et on le fait suivre du nom de la méthode :
Code : Objective-C
Si la méthode demande une valeur en entrée, faites suivre le nom de la méthode par le caractère «
: » et entrez la valeur après ce caractère :
Code : Objective-C
Si une méthode demande plusieurs paramètres, séparez-les par un espace et indiquez la valeur de ces paramètres après le caractère «
: ». Ici par exemple, trois paramètres sont transmis à la méthode. Le premier suit le nom de la méthode (
methode:valeur1) et les deux autres sont précédés du nom du paramètre correspondant (
param2:valeur2 et
param3:valeur3) :
Code : Objective-C | [objet methode:valeur1 param2:valeur2 param3:valeur3];
|
Une méthode peut retourner un objet. Dans ce cas, vous pouvez le stocker dans une variable :
Code : Objective-C | variable = [objet methode];
|
Ou encore :
Code : Objective-C | variable = [objet methode:entree];
|
Si la méthode retourne un objet, vous pouvez enchaîner plusieurs appels de méthodes (c'est d'ailleurs ce qu'on appelle un chaînage). Dans l'exemple suivant, le paramètre
param1 est envoyé à la méthode
methode1, et cette dernière est appliquée à l'objet
objet1. Le résultat de la méthode est un objet auquel on applique la méthode
methode2 avec le paramètre
param2 :
Code : Objective-C | [[objet1 methode1:param1] methode2:param2];
|
Je vous conseille de limiter le chaînage à deux appels de méthodes. Au-delà, le code perd rapidement en lisibilité.
Si les choses ne sont pas très claires, examinez la figure suivante.
Je ne comprends rien à ce schéma ! Pourrais-je avoir quelques explications ?
Pour comprendre ce schéma, il suffit de suivre les flèches, de la gauche vers la droite.
parametre 1 est passé à la
methode 1 de l'
objet 1. Cette méthode fait un traitement et retourne un résultat sous la forme d'un objet (la deuxième flèche rouge). La
methode 2 de cet objet est exécutée, en lui passant le
parametre 2 en entrée (la troisième flèche rouge). Le résultat final est représenté par la quatrième flèche rouge.
J'espère que c'est plus clair cette fois-ci. Dans le cas contraire, relisez ce qui vient d'être dit. Il n'y a rien de vraiment sorcier là-dedans… ;-)
Les méthodes ne sont pas l'apanage des objets : elles peuvent également être appliquées à des classes. Par exemple, pour créer une variable de type
NSString, vous appliquerez la méthode
string de la classe
NSString :
Code : Objective-C | NSString* uneChaine [NSString string];
|
Cette instruction peut être simplifiée comme suit :
Code : Objective-C
Je suis sûr que vous préférez la deuxième syntaxe à la première. Je dois bien avouer que moi aussi !
Appel d'une méthode existante
Et maintenant, un peu de pratique. Vous allez utiliser un peu de code Objective-C pour concaténer (coller si vous préférez) deux chaînes
NSString et afficher le résultat dans la console du Simulateur iOS.
Définissez un nouveau projet basé sur le modèle
Single View Application et donnez-lui le nom « test ».
Cliquez sur
ViewController.m dans le volet de navigation et repérez la méthode
viewDidLoad. Cette méthode est exécutée dès le démarrage de l'application. Vous allez y ajouter quelques instructions pour tester l'exécution de méthodes.
La méthode
viewDidLoad (ainsi que de nombreuses autres méthodes) a été générée par Xcode. Voici à quoi elle doit ressembler :
Code : Objective-C | - (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
|
Le message
[super viewDidLoad] exécute la méthode
viewDidLoad de la classe parente (
super) de la classe en cours d'exécution. Étant donné que notre classe
test hérite de la classe
UIView, cette instruction va exécuter la méthode
viewDidLoad de la classe
UIView.
Comme vous le verrez au fur et à mesure de votre apprentissage, cette technique est des plus courantes. Juste pour vous en convaincre, examinez les autres méthodes générées par Xcode (viewDidUnoload, viewWillAppear, viewDidAppear, etc.). Chacune d'elles utilise un message similaire.
La ligne de commentaire n'a aucune utilité. Vous pouvez la supprimer.
Pour concaténer deux chaînes, vous utiliserez la méthode
stringByAppendingString en envoyant un message du type suivant :
[chaine1 stringByAppendingString: chaine2];
où
chaine1 et
chaine2 sont les deux chaînes à concaténer.
Complétez la méthode
viewDidLoad comme suit :
Code : Objective-C | - (void)viewDidLoad
{
[super viewDidLoad];
NSString* chaine = @"un ";
chaine = [chaine stringByAppendingString:@"texte"];
NSLog(@"%@",chaine);
}
|
Exécutez l'application en cliquant sur l'icône
Run. La figure suivante représente ce que vous devriez obtenir dans la console.
Examinons les instructions utilisées dans la méthode
viewDidLoad.
La ligne 4 définit l'objet
NSString chaine et lui affecte la valeur « un » :
Code : Objective-C | NSString* chaine = @"un ";
|
La ligne 5 applique la méthode
stringByAppendingString à l'objet
NSString chaine en lui passant le paramètre « texte ». Le résultat est stocké dans l'objet
chaine (
chaine =) :
Code : Objective-C | chaine = [chaine stringByAppendingString:@"texte"];
|
Enfin, la ligne 6 affiche le contenu de l'objet
chaine (c'est-à-dire « un texte ») :
Code : Objective-C
Création et appel d'une méthode
Vous venez d'apprendre à appeler la méthode
stringByAppendingString. Cette méthode fait partie des méthodes standards de la classe
NSString.
Vous allez maintenant aller un peu plus loin en créant une méthode et en l'appelant. Cette méthode :
- aura pour nom « concat » ;
- recevra deux paramètres NSString ;
- renverra leur concaténation dans un objet NSString.
Munis de toutes ces informations, vous devriez pouvoir définir le gabarit (c'est-à-dire l'allure) de la méthode :
Code : Objective-C | -(NSString*) concat:(NSString*)ch1: (NSString*)ch2;
|
Cliquez sur
ViewController.h dans le volet de navigation et ajoutez ce gabarit dans le fichier d'en-têtes, après l'instruction
@interface.
Il n'y a rien de bien compliqué dans ce gabarit. Si vous ne comprenez pas comment il est construit, relisez la section « Définir des méthodes ».
Le fichier d'en-têtes doit maintenant ressembler à ceci :
Code : Objective-C | #import <UIKit/UIKit.h>
@interface ViewController : UIViewController
-(NSString*) concat:(NSString*)ch1: (NSString*)ch2;
@end
|
Maintenant, vous allez écrire quelques lignes de code dans le fichier
ViewController.m. Cliquez sur ce fichier dans le volet de navigation et définissez la méthode
concat, juste au-dessous de l'instruction
@implementation :
Code : Objective-C | -(NSString*) concat:(NSString*)ch1: (NSString*)ch2
{
return [ch1 stringByAppendingString:ch2];
}
|
La première ligne reprend le gabarit de la fonction.
La troisième ligne définit l'objet retourné par la méthode (
via return). Cet objet est le résultat de la concaténation de
ch1 et
ch2, passés en arguments.
Et maintenant, modifiez la méthode
viewDidLoad comme suit pour appeler la méthode
concat et afficher le résultat retourné dans la console :
Code : Objective-C | - (void)viewDidLoad
{
[super viewDidLoad];
NSString* chaine = [self concat: @"premier ":@"deuxième"];
NSLog(@"%@",chaine);
}
|
La ligne 4 définit le
NSString chaine (
NSString* chaine) et lui affecte la valeur retournée par la méthode
concat, en lui passant les
NSString « premier » et « deuxième ».
Que signifie le mot self dans ce code ?
Il signifie que la méthode
concat a été définie dans la classe courante, tout simplement.
Enfin, la ligne 5 affiche le résultat retourné par
concat dans la console. Exécutez l'application. La figure suivante représente ce que vous devriez obtenir dans la console.
Crochet ou point ?
Deux styles d'écriture peuvent être utilisés pour appeler une méthode : les crochets ou les points. À titre d'exemple, les deux instructions suivantes sont équivalentes :
Code : Objective-C | [voiture setCouleur:@"rouge"];
voiture.couleur = @"rouge";
|
Ces deux écritures font une seule et même action : elles appliquent la méthode
couleur à l'objet
voiture en lui passant l'entrée
rouge.
L'écriture « à point » ne fonctionne que pour les variables d'instance.
Les deux lignes suivantes sont elles aussi équivalentes :
Code : Objective-C | laCouleur = [voiture couleur];
laCouleur = voiture.couleur;
|
Vous l'aurez compris, elles lisent la couleur de l'objet
voiture et la stockent dans la variable
laCouleur.
Créer un objet
La gestion mémoire d'un objet peut être automatique ou manuelle. Dans le premier cas, lorsque l'objet n'est plus utilisé, il est automatiquement retiré de la mémoire. Dans le deuxième cas, c'est à vous de le retirer de la mémoire pour éviter qu'elle ne se sature.
À titre d'exemple, pour créer l'objet
NSString maChaine avec une gestion automatique de la mémoire, vous utiliserez l'instruction suivante :
Code : Objective-C | NSString* maChaine = [NSString string];
|
Ou plus simplement :
Code : Objective-C
Si vous préférez gérer manuellement l'objet
NSString maChaine en mémoire, vous utiliserez l'instruction suivante :
Code : Objective-C | NSString* maChaine = [[NSString alloc] init];
|
Examinons cette deuxième écriture. Dans un premier temps, la méthode
alloc est appliquée à la classe
NSString. Cette opération réserve un espace mémoire et instancie un objet
NSString. Dans un deuxième temps, la méthode
init est appliquée à cet objet pour l'initialiser et le rendre utilisable (ce n'est qu'après l'initialisation de l'objet que l'on peut lui appliquer des méthodes).
Si nécessaire, il est possible d'affecter une valeur à un objet
NSString.
Voici l'instruction à utiliser si vous optez pour une gestion automatique de la mémoire :
Code : Objective-C | NSString* maChaine = [NSString stringWithString:@"Une chaîne quelconque"];
|
Ou plus simplement :
Code : Objective-C | NSString* maChaine = @"Une chaîne quelconque";
|
Et voici les instructions à utiliser si vous optez pour une gestion manuelle de la mémoire :
Code : Objective-C | NSString* maChaine2 = [[NSString alloc] init];
maChaine2 = @"Une chaîne quelconque";
|
La gestion mémoire automatique ou manuelle ne se limite pas aux objets de classe NSString : vous pouvez utiliser des techniques similaires pour créer et instancier des objets d'une quelconque autre classe.
Cycle de vie des objets
Tout comme les êtres vivants, les objets utilisés dans une application iOS ont un cycle de vie.
- Création.
- Utilisation.
- Destruction.
Une très bonne nouvelle : iOS 5 introduit un système nommé ARC (
Automatic Reference Counting) qui automatise le cycle de vie des objets. Désormais, c'est le compilateur qui se charge de cette tâche ingrate qui consiste à détruire les objets une fois qu'ils ne sont plus utilisés.
Je ne m'étendrai pas plus sur le sujet, mais sachez que vous échappez à des complications aussi inutiles que dangereuses.