Comprendre la méthode init
protocomm
Membre
Bonjour, je suis tout nouveau, un vrai newbie dans le monde cocoa.
Je reconnais quand meme Ali qui si je ne m'abuse fait parti du forum AS.
J'aimerais être capable de développer des applis en objective C, pour cela je lis le bouquin "Cocoa Programming for Mac OS X dummies", mais je coince à certains moments, comme par exemple le fait d'utiliser la méthode init:
- (id) init {
if (self = [super init]) {
variables balance = 100.0;
} return self;
}
le if (self = [super init]) ????? je ne comprends pas du tout meme après avoir fait plusiaurs recherches sur le sujet.
Si quelqu'un pouvait éclairer mes lanternes.
En vous remerciant.
Je reconnais quand meme Ali qui si je ne m'abuse fait parti du forum AS.
J'aimerais être capable de développer des applis en objective C, pour cela je lis le bouquin "Cocoa Programming for Mac OS X dummies", mais je coince à certains moments, comme par exemple le fait d'utiliser la méthode init:
- (id) init {
if (self = [super init]) {
variables balance = 100.0;
} return self;
}
le if (self = [super init]) ????? je ne comprends pas du tout meme après avoir fait plusiaurs recherches sur le sujet.
Si quelqu'un pouvait éclairer mes lanternes.
En vous remerciant.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Cela retourne un objet qui est théoriquement le même que self.
Cependant, il peut arriver que ce ne soit pas le même. Dans ce cas là , on remplace self par l'objet retourné.
On en est donc à "self = [super init]".
Maintenant, pourquoi le if ?
Si jamais le init plante, il retourne nil. Dans ce cas, ce n'est plus la peine de continuer à initialiser l'objet puisqu'il n'existe pas. Le if permet donc de vérifier que l'objet existe toujours.
mais "Cela retourne un objet qui est théoriquement le même que self", je croyais que self permettait d'envoyer un message à toutes les methodes de la classe.......c'est quoi self ?????
Alors self et super :
self : c'est un pointeur vers ton objet courant. Lorsque tu travail avec un langue orienté objet comme le Cocoa tu a des canevas (les classes) qui te servie a créer X objet sur la même base, mais chaque objet sera indépendant au cours de sa vie. Du coup il faut bien un mot clef pour par exemple lui dire d'appeler une de ses propres méthodes (quelles soit de classe ou d'instance)
super : Lorsque tu code en orienté objet tu es amené à sous classer, c'est à dire prendre une classe existante (NSObject par exemple) puis partir de la pour créer tes propres objets, ça évite de réinventer la roue à chaque fois. Il va donc y avoir des moment ou tu va surcharger une méthode, c'est à dire prendre une méthode qui existe déjà dans une classe parente et la ré implémenter pour en modifier le comportement, et dans certain cas tu aimerais quand même pouvoir accéder à la méthode de la classe parente, le mot clef super est fait pour ça, il dit "je veux appeler tel méthode mais pas qui a été codé par mon ancêtre, pas par moi"
Pour en revenir au init :
le init sert a initialisé ton objet courant (l'objet créé a partir de ton canevas, la classe). Pour éviter d'avoir à réinventer la roue tu va faire un [super init] pour que tes ancêtres s'initialisent et fassent plein de truc fun à ta place. Quand le mec a codé NSObject il s'est dit un truc : "Si j'ai un problème durant mon initialisation de base je m'auto-détruit et je renvois nil pour dire que j'ai eu un blem, autre cas, j'ai besoin pour X raison de déplacer mon objet en mémoire, il faudra que je renvois ma nouvelle adresse". Donc toi ayant lu la doc et sachant ça tu va prendre la valeur de retour du parent pour mettre a jour ton pointeur self, et comme il se peut qu'après ça il soit à nil tu check avant d'instancier à ton tour.
En espérant que ça puisse t'aider :-)
Imagine que tu crée une classe voiture qui hérite de NSObject, si dans ta classe tu as prévu d'initialiser des valeurs par défaut par exemple nbreDeRoue = 4 etc...
Lorsque tu va créer une instance voiture que tu nommeras 2cv par exemple si tu ne fait pas appel a [super init] ton nbreDeRoue ne sera pas initialisé a sa valeur par defaut. Dans ce cas ce n'est pas très grave je te l'accorde...
Les exemples sont beaucoup plus parlant.
La pratique également ! Bon courage !
Cependant, ce n'est pas forcément le bon exemple car les 4 roues sont définies dans l'init de la classe voiture et non NSObject.
Pour reprendre le même exemple de la voiture :
On a une classe Voiture qui définit 4 roues dans son propre init. Ainsi, chaque instance de Voiture aura 4 roues.
Maintenant, prenons une classe 2cv héritant de Voiture. Dans le init de 2cv, on va faire un [super init] puis définir le nombre de chevaux à 2. Ainsi, chaque instance de 2cv se retrouvera avec 2 chevaux mais également avec 4 roues car le [super init] correspond au init de la classe Voiture.
Oui exact, j'ai dis que l'on créer une instance, alors qu'effectivement il faut que la 2cv hérite de voiture qui elle même hérite d'NSObject. Autant pour moi je vais devoir payer ma tournée ?
Ca fait pas l'ombre d'un doute ça !
Allez tournée générale alors !Â
burps
T'en fait pas, Thibaut et moi nous sommes déjà fait avoir sur cette colle la il y a deux ans maintenant par une amie commune, depuis on se fait plaisir à ressortir la correction :-p ça fait toujours son petit effet XD
Moi c'est pas par manque d'effort, c'est parce que j'ai du mal et je m'en veux un peu, j'aimerais bien être irréprochable en la matière, mais il va me falloir du temps, enfin j'espère que le temps m'aidera... J'ai des lacunes, mais je ne désespère pas !
Concurrent ? où ça concurrent ?
Tu parles de la minuscule portion causant de cocoa sur macFr ou de la minuscule portion parlant du matériel Mac sur PommeDev' ?
Bon, c'est vrai qu'il y a un terrain commun, mais une concurrence ...? ???
Forum confrère, Forum ami, ou autre ... serait mieux non ?
:P