2010-11-03 6 views
6

Si nous ne voulons pas implémenter la méthode init dans notre classe, et sachant que init dans NSObject ne renvoie qu'une instance de l'objet sans initialisation, je ne vois pas l'intérêt d'appeler init si nous avons déjà l'instance avec alloc. J'ai essayé et cela fonctionne, mais je ne suis pas sûr que cela ne causera pas de problèmes futurs.Serait-ce correct/ellegant utilise uniquement alloc sans init?

myClass *newObject = [myClass alloc]; 

au lieu de:

myClass *newObject = [[myClass alloc] init]; 

Merci beaucoup.

Répondre

16

Non, simplement appeler alloc ne serait pas correct. alloc met à zéro toutes les variables d'instance de l'objet, init puis a la possibilité de définir toutes ou certaines variables d'instance sur leurs valeurs par défaut. Certaines classes utilisent même leurs méthodes init pour créer une autre instance et renvoyer celle-ci au lieu de celle que vous avez allouée.

De nombreuses classes s'attendent à ce que leurs méthodes init soient appelées et pourraient provoquer des plantages si vous n'appelez pas init. Si vous parlez d'une classe personnalisée qui hérite directement de NSObject et n'a pas besoin d'initialisation de variables d'instance, vous pouvez vous en sortir avec [myClass alloc] mais ce n'est certainement pas un bon style de programmation.

+0

Merci beaucoup pour l'explication. "Si vous parlez d'une classe personnalisée qui hérite directement de NSObject et qui n'a pas besoin d'initialisation de variables d'instance, vous pourriez vous en sortir avec [myClass alloc] mais ce n'est certainement pas un bon style de programmation." C'était mon cas. Réponse acceptée. – toupper

+2

@toupper: Si vous voulez une syntaxe plus courte, vous pouvez faire '[myClass new];' qui équivaut à '[[myClass alloc] init];', mais il pourrait difficilement être considéré comme étant en vogue . –

2

Je pense que ce n'est pas une bonne idée.
Lire Design Pattern Cocoa, en particulier les « Deux création scénique »

Vous pouvez également lire cet article http://www.informit.com/articles/article.aspx?p=1398610

+0

Merci beaucoup, informations utiles. – toupper

+0

Je ne comprends pas vraiment le point "Cocoa Design Pattern - Création en deux étapes": il prétend que la création en deux étapes est meilleure car elle évite l'explosion des "constructeurs/méthodes de classe/méthodes d'usine", mais [[Foo alloc] init] même chose que Foo f = new Foo(); f.init() ;? –

0

Je pense qu'il ne serait pas beaucoup d'importance si vous n'avez pas mettre en œuvre un « - (id) init "car si vous le faisiez, vous appelleriez la méthode init de NSObject qui retourne juste la même valeur que vous envoyez à la méthode. Bien que ce soit une bonne idée de créer votre propre méthode init pour définir votre variable d'instance.

Questions connexes