Instanciation d'un classe

CoreCore Membre
janvier 2005 modifié dans API AppKit #1
Bonjour,

Dans la série mieux vaut avoir l'air ridicule le temps d'une question que rester stupide toute sa vie:

Quel est la fonction exacte de ces deux etapes (c'est surtout la deuxième qui me semble floue).

MaClass *monObjet ;


monObjet = [[MaClass alloc] init]  ; [\code]

Réponses

  • BruBru Membre
    22:55 modifié #2
    dans 1105606277:

    Quel est la fonction exacte de ces deux etapes (c'est surtout la deuxième qui me semble floue).
    monObjet = [[MaClass alloc] init];


    Pour donner des explications, je vais décomposer cette ligne par :
    [tt]
    monObjet = [MaClass alloc];
    monObjet = [monObjet init];
    [/tt]

    ce qui est strictement identique à  ton code.

    La première méthode exécutée est alloc. Il s'agit d'une méthode de classe (c'est MaClass qui exécute la méthode).
    Cette méthode permet tout simplement de créer l'objet en mémoire. Après création, cette méthode renvoie la référence de cet objet (que tu stockes dans la variable monObjet).

    La seconde méthode est init. c'est une méthode d'instance (c'est monObjet qui exécute la méthode).
    Cette méthode initialise l'objet créé en mémoire par alloc. cette initialisation permet de mettre l'objet dans un état connu.
    init renvoie à  nouveau l'objet qui vient d'être initialisé (c'est pourquoi on restocke ça dans monObjet).

    .
  • CoreCore Membre
    22:55 modifié #3
    merci pour ces précisions !

    Pourrais tu me faire le meme topo pour la premiere etape :

    NSClasse *monObjet ;
    
  • BruBru Membre
    22:55 modifié #4
    Le code
    [tt]
    NSClasse *monObjet ;
    [/tt]
    permet de déclarer un pointeur (ou référence) d'objet dont la classe est NSClasse. Le pointeur de cet objet sera stocké dans la variable monObjet .

    Donc il s'agit d'une bête déclaration de varaible C, au même titre que
    [tt]int unNombre;
    [/tt]pour déclarer un nombre entier, ou
    [tt]char unCaractere;
    [/tt]pour déclarer un caractère.

    .
  • 22:55 modifié #5
    J'ai une bête question stupide à  ce sujet.

    dans 1105607656:

    [tt]
    monObjet = [monObjet init];
    [/tt]


    Tu es obligé de redéfinir le pointeur? [tt][objet init];[/tt] Ne serait pas suffisant? Il me semble que la fonction du init est de donner des valeurs acceptables aux variables d'instance (je dis il me semble car je peux imaginer que dans certains cas il peut y avoir d'autres choses, mais mon expérience limitée ne permet pas de les imaginer ;)). Parce que dans ce cas pour rester logique, il faudrait redéfinir le pointeur pour chaque changement de valeur d'une variable d'instance, ce qui n'est pas le cas.
  • BruBru Membre
    22:55 modifié #6
    As tu lu un jour la doc Apple sur la méthode init de NSObject ?

    Non ? Car c'est plein d'enseignement :
    If it can't be initialized, they should release the object and return nil.
    In some cases, an init method might release the new object and return a substitute.
    Programs should therefore always use the object returned by init, and not necessarily the one returned by alloc or allocWithZone:, in subsequent code.


    La doc complète est ici.

    .
  • CoreCore Membre
    22:55 modifié #7
    bon une derniere question pour me lever le doute :

    dans les quelques lignes de codes que j'ai ecrites, je n'ai pas utilisé init + alloc, en quoi cette etape est fondamendale ?

    merci !!!!!!  o:)
  • BruBru Membre
    22:55 modifié #8
    Certaines classes fournissent des méthodes "convénientes" qui font automatiquement le alloc+init en interne.

    Par contre, ces méthodes convénientes font aussi un autorelease sur l'objet crée, ce qui fait qu'on utilise souvent les méthodes convénientes pour avoir des objets temporaires, alors qu'on utilisera plutôt alloc+init pour avoir des objets que l'on veut garder longtemps en mémoire.

    .
Connectez-vous ou Inscrivez-vous pour répondre.