Comprendre la méthode init

protocommprotocomm Membre
21:02 modifié dans API AppKit #1
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.

Réponses

  • ThibautThibaut Membre
    21:02 modifié #2
    Le [super init] permet d'appeler le init de la classe parente (généralement NSObject).
    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.
  • protocommprotocomm Membre
    21:02 modifié #3
    Merci de ta réponse...

    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 ?????
  • yoannyoann Membre
    21:02 modifié #4
    Tiens c'est justement le sujet du slide que je suis entrain d'écrire ^^

    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 :-)
  • NseaProtectorNseaProtector Membre
    21:02 modifié #5
    Si je ne me trompe pas, les pros le diront...
    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...
  • protocommprotocomm Membre
    21:02 modifié #6
    Je te remercie NseaProtector, c'est devenu plus clair.
    Les exemples sont beaucoup plus parlant.
  • wiskywisky Membre
    21:02 modifié #7
    dans 1260806857:

    Je te remercie NseaProtector, c'est devenu plus clair.
    Les exemples sont beaucoup plus parlant.

    La pratique également ! Bon courage !
  • ThibautThibaut Membre
    21:02 modifié #8
    dans 1260806031:

    Si je ne me trompe pas, les pros le diront...
    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...

    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.
  • NseaProtectorNseaProtector Membre
    21:02 modifié #9
    dans 1260808433:

    dans 1260806031:

    Si je ne me trompe pas, les pros le diront...
    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...

    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 ?
  • ClicCoolClicCool Membre
    21:02 modifié #10
    dans 1260809076:
    .../...Autant pour moi je vais devoir payer ma tournée ?


    :p Ca fait pas l'ombre d'un doute ça !  :p
  • ThibautThibaut Membre
    21:02 modifié #11
    Je dirais même plus : deux tournées ! Une seconde pour le "Autant pour moi" au lieu de "Au temps pour moi".
  • NseaProtectorNseaProtector Membre
    décembre 2009 modifié #12
    dans 1260817958:

    Je dirais même plus : deux tournées ! Une seconde pour le "Autant pour moi" au lieu de "Au temps pour moi".
    Non, c'est vrai ça s'écrit comme ça ? Tu me perturbe avec le sens de cette expression du coup ! T'es sur ?
    :p Allez tournée générale alors !  :p
  • Eddy58Eddy58 Membre
    21:02 modifié #14
    dans 1260819646:


    :p Allez tournée générale alors !  :p

    :) burps  :p :p
  • NseaProtectorNseaProtector Membre
    21:02 modifié #15
    dans 1260820096:
    Et bien, ravi de l'apprendre ! Déjà  que je fait pleins de fautes de grammaire et de conjugaison !
  • yoannyoann Membre
    21:02 modifié #16
    dans 1260822946:

    dans 1260820096:
    Et bien, ravi de l'apprendre ! Déjà  que je fait pleins de fautes de grammaire et de conjugaison !


    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
  • AliGatorAliGator Membre, Modérateur
    21:02 modifié #17
    Pareil, on a eu une longue discussion à  ce sujet sur un forum concurrent (macfr pour ne pas le nommer), du coup maintenant quasiment tous les membres sont au taquet à  chaque fois que qqun fait l'erreur ;D
  • ThibautThibaut Membre
    21:02 modifié #18
    Et maintenant on va pourvoir passer aux "malgré que" et "pallier à ".
  • AliGatorAliGator Membre, Modérateur
    21:02 modifié #19
    C'est vrai, malgré le fait que la plupart des gens qui écrivent sur un forum ne fassent plus trop d'effort pour écrire français correctement, on peut tout de même essayer de palier leur manque de connaissance sur ce sujet :P
  • NseaProtectorNseaProtector Membre
    21:02 modifié #20
    dans 1260920010:

    C'est vrai, malgré le fait que la plupart des gens qui écrivent sur un forum ne fassent plus trop d'effort pour écrire français correctement, on peut tout de même essayer de palier leur manque de connaissance sur ce sujet :P

    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 !
  • ClicCoolClicCool Membre
    décembre 2009 modifié #21
    dans 1260920010:

    C'est vrai, malgré le fait que la plupart des gens qui écrivent sur un forum ne fassent plus trop d'effort pour écrire français correctement, on peut tout de même essayer de palier leur manque de connaissance sur ce sujet :P
    Ouais, ça veut donner des leçons de précisions et exactitude, mais ça écris ça aussi:
    dans 1260918712:
    .../... sur un forum concurrent (macfr pour ne pas le nommer).../...


    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
Connectez-vous ou Inscrivez-vous pour répondre.