49 votes

alloc, init, et new en Objective-C

Un livre sur la programmation de l'iPhone instancie les classes comme ceci :

[[Class alloc] init]

Un autre livre sur l'Objective-C le présente ainsi :

[Class new]

Quelle est la différence ?

75voto

bbum Points 124887

+new est implémenté littéralement comme :

+ (id) new
{
    return [[self alloc] init];
}

Rien de plus, rien de moins. Les classes peuvent l'outrepasser, mais c'est très atypique et il est préférable de faire quelque chose comme +fooWithBar: .

72voto

Chuck Points 138930

À l'origine, en Objective-C, les objets étaient créés avec new. Au fur et à mesure de l'évolution du framework OpenStep/Cocoa, les concepteurs ont estimé que l'allocation de la mémoire pour un objet et l'initialisation de ses attributs étaient des préoccupations distinctes et devaient donc être des méthodes séparées (par exemple, un objet peut être alloué dans une zone de mémoire spécifique). C'est ainsi que le style alloc-init de création d'objet est devenu populaire.

Fondamentalement, les nouvelles méthodes sont anciennes et presque, mais pas tout à fait, dépréciées - ainsi, vous verrez que les classes Cocoa ont beaucoup de méthodes init mais presque jamais de nouvelles méthodes personnalisées.

13voto

Pumbaa80 Points 27066

Comme déjà mentionné, par défaut, il n'y a pas de différence. Mais vous pouvez écraser le new méthode de classe. La documentation d'Apple a quelques réflexions à ce sujet.

Contrairement à alloc , nouveau est parfois réimplémenté dans des sous-classes pour invoquer une initialisation spécifique à la classe d'initialisation spécifique à la classe[...] Souvent nouveau... Les méthodes seront font plus que l'allocation et l'initialisation initialisation.

3voto

Josh Points 849

Cela dépend de la classe, mais [Class new] est très probablement une méthode de commodité qui appelle [[Class alloc] init] interne. Ainsi, vous ne pouvez pas appeler d'autres méthodes d'init telles que "initWithString".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X