Initialisation avec new, alloc init....???

LeLaidLeLaid Membre
09:06 modifié dans API AppKit #1
Encore bonjour et encore une question... plus métaphysique cette fois  :P

Quelle est la différence entre les initialisations suivantes?
  • [[xxx alloc] init]
  • [xxx new]


J'avoue ne pas bien comprendre quand je dois initialiser un objet... et quand je ne dois pas le faire....

Y a-t-il une documentation spécifique sur le sujet?

Pascal

Réponses

  • schlumschlum Membre
    09:06 modifié #2
    C'est la même chose...

    new

    Allocates a new instance of the receiving class, sends it an init message, and returns the initialized object.

    + (id)new


    This method is a combination of alloc and init. Like alloc, it initializes the isa instance variable of the new object so it points to the class data structure. It then invokes the init method to complete the initialization process.


    ... Sauf si ça a été sous-classé.

    Unlike alloc, new is sometimes re-implemented in subclasses to invoke a class-specific initialization method. If the init... method includes arguments, they're typically reflected in a new... method as well.
  • LeLaidLeLaid Membre
    09:06 modifié #3
    Ah, ok
    Merci
  • CéroceCéroce Membre, Modérateur
    09:06 modifié #4
    new fut introduit à  cause du ramasse-miette ou me trompe-je ?
  • schlumschlum Membre
    09:06 modifié #5
    dans 1235059666:

    new fut introduit à  cause du ramasse-miette ou me trompe-je ?


    C'est marqué depuis 10.0 dans la doc, donc tu dois te tromper  :P (ou alors la doc est fausse...)
    J'ai regardé parce que ça m'étonnait aussi ; jamais entendu parler...
  • AliGatorAliGator Membre, Modérateur
    09:06 modifié #6
    Si si ça existe depuis un bail voir le début, c'est juste un constructeur de commodité, essentiellement introduit j'imagine pour ceux qui viennent du C++ pour qu'ils ne soient pas trop perdus avec le alloc/init :P
  • schlumschlum Membre
    février 2009 modifié #7
    dans 1235063721:

    Si si ça existe depuis un bail voir le début, c'est juste un constructeur de commodité, essentiellement introduit j'imagine pour ceux qui viennent du C++ pour qu'ils ne soient pas trop perdus avec le alloc/init :P


    Ah non, c'est pas de commodité puisque pas auto-released  :P

    (Selon la définition d'Apple...
    Many classes provide methods of the form +className... that you can use to obtain a new instance of the class. Often referred to as “convenience constructors”, these methods create a new instance of the class, initialize it, and return it for you to use. Although you might think you are responsible for releasing objects created in this manner, that is not the case according to the policy Cocoa set"the method name does not contain "alloc" or "copy", or begin with "new".
    )
  • GreensourceGreensource Membre
    09:06 modifié #8
    Juste pour que je ne parte pas à  faire n'importe quoi, depuis l'introduction du garbage collector et si je l'active, je n'ai plus du tout à  me préoccuper de la mémoire? Les autorelease pool et Cie plus besoin? Ou alors j'ai tout faux et je reprend tout mon code ^^
  • Philippe49Philippe49 Membre
    09:06 modifié #9
    dans 1235151507:

    Juste pour que je ne parte pas à  faire n'importe quoi, depuis l'introduction du garbage collector et si je l'active, je n'ai plus du tout à  me préoccuper de la mémoire? Les autorelease pool et Cie plus besoin? Ou alors j'ai tout faux et je reprend tout mon code ^^


    D'après ce que j'ai cru comprendre des discussions précédentes sur ce forum, le garbage collector cela signifie souvent dans un premier temps "Pas Vu, Pas Pris", puis dans un second temps "Pris, Pendu".
    Bref il vaut mieux bien suivre le retain-release et maà®triser pas à  pas la gestion de la mémoire. Enfin c'est mon avis.
  • AliGatorAliGator Membre, Modérateur
    09:06 modifié #10
    Oui je plussoie avec Philippe.

    Le Garbage Collector, c'est bien et ça semble pratique car le principe à  la base c'est "je crée mon objet, et je m'en fous ensuite, il va se démerder pour le détruire quand il verra que j'en ai plus besoin" donc vu comme ça on se dit "ouah trop cool plus la peine de se prendre la tête avec les retain/release, je me pose plus de questions je code comme un porc"...

    Mais en fait y'a plein de petites subtilités dans le Garbage Collector (les strong et weak references, le drain de l'autoreleasepool, et plein de petits chausse-trappes cachés) et en plus côté pédagogique c'est zéro... d'autant que pour comprendre les subtilités du GC faut à  mon sens avoir déjà  compris le fonctionnement habituel de la mémoire (donc du retain/release) pour capter pourquoi ça peut coincer parfois... En plus les règles du retain/release sont finalement pas si compliquées pour pas dire super simples si on respecte les 4 ou 5 points donnés par Apple qui sont somme toute logiques. Juste une question d'habitude quoi.


    Après, y'a certainement des partisans du Garbage Collector, encore plus ceux qui viennent du monde Java (Java utilise aussi un GC, d'ailleurs il n'utilise que ça y'a pas moyen de supprimer explicitement un objet... à  part le mettre à  null mais de toute façon ça impose que le GC fasse un cycle de vérification pour se rendre compte qu'alors on utilise plus l'objet... bref)... mais moi je trouve ça limite dangereux voir antipédagogique.

    C'est un peu comme les bindings en somme : l'idée de base est séduisante, et on a envie de céder à  la facilité en se disant "ouah ça nous évite de nous prendre le chou"... mais quand on creuse un peu et à  l'usage, surtout si on veut faire des trucs un peu plus poussés... on se rend vite compte des limitations. Donc l'idée est bonne, ça semble plus simple, mais je trouve ça piégeant à  terme.
  • GreensourceGreensource Membre
    09:06 modifié #11
    hum..quand tu dit "piégeant à  terme" tu penses que je ferais mieux de m'y mettre de suite pour le moindre petit projet? Moi je viens de Java, on nous apprend quasi que ça en cours. J'ai fait par moi même une partie du Cocoa par la pratique de Hillgass. J'avoue que j'ai surtout retenu le: "Si vous vous servez du GC ne tenez plus compte des retain/release de la suite"  ::)
    En fait là  où j'avais eu un peu de mal à  comprendre c'était avec les autorelease, je trouvais que ça ressemblais au GC finalement.
    Je vais quand même allez relire ce chapitre et essayer de rendre mon code plus propre tant qu'il est encore petit!
  • Philippe49Philippe49 Membre
    09:06 modifié #12
    dans 1235171593:

    hum..quand tu dit "piégeant à  terme" tu penses que je ferais mieux de m'y mettre de suite pour le moindre petit projet?

    Non, c'est tout le contraire. Il vaut mieux éviter le GC, au moins quand on débute.

    dans 1235171593:

    En fait là  où j'avais eu un peu de mal à  comprendre c'était avec les autorelease, je trouvais que ça ressemblais au GC finalement.

    L'autorelease est un simple release retardé.
  • AliGatorAliGator Membre, Modérateur
    09:06 modifié #13
    dans 1235174396:

    dans 1235171593:

    hum..quand tu dit "piégeant à  terme" tu penses que je ferais mieux de m'y mettre de suite pour le moindre petit projet?

    Non, c'est tout le contraire. Il vaut mieux éviter le GC, au moins quand on débute.
    Oui enfin moi j'aurais dit "Oui tout à  fait... je pense qu'il faut mieux que tu t'y mettes tout de suite... au retain/release, et donc que tu abandonnes tout de suite le GC :P Enfin bon on est donc d'accord quoi :P

    Après ce n'est que mon avis (partagé à  priori par Philippe), y'en a qui sont pas si radicaux que nous, et n'ayant pas fait assez de Java pour savoir te dire si les pièges du GC qu'on a sous Objective-C sont des pièges que tu connais peut-être déjà  pour avoir vu les mêmes en Java ou pas du tout... mais bon quand on regarde proprement comment fonctionne le retain/release/autorelease finalement c'est pas si méchant et logique donc à  mon avis mieux de s'y mettre dès le départ.

    D'autant que si un jour tu passes à  l'iPhone pour développer sur iPhone en plus de sous Mac, il faudra de toute façon t'y mettre car sous iPhone le GC n'est pas disponible ;) Donc autant s'y mettre de suite :P
  • schlumschlum Membre
    09:06 modifié #14
    Je déteste les Garbage Collector...

    L'auto-release ça n'a rien à  voir avec. ça consiste à  mettre des objets dans une liste qui sera vidée à  la fin de l'événement.
Connectez-vous ou Inscrivez-vous pour répondre.