Question

est l'un de ces deux façons de créer et d'initialiser un objet préféré?

MyClass oClass = [[MyClass alloc] init];
oClass.length = 5;
oClass.text = @"Hello";

ou en utilisant une méthode de classe qui contient environ le même code mais ressemble à ceci:

MyClass oClass = [MyClass myClassWithLength:(int) 5 andText:(NSString *) @"Hello"];

Je déteste quand je vois les choses plus d'une façon et je ne sais pas si l'on est meilleur que l'autre, ou pourquoi!

Était-ce utile?

La solution

Ne pas être un ennemi. : -)

Par ailleurs, je suppose que vous vouliez dire:

( Edit: supprimés moulages inutiles)

MyClass oClass = [[MyClass alloc] initWithLength:5 andText:@"Hello"];

La raison de plusieurs méthodes d'initialisation ... est de le rendre plus pratique pour les développeurs de créer des instances correctement initialisés. Ainsi, par exemple, si vous trouvez que les développeurs ont souvent besoin de créer des instances de MaClasse avec une longueur et du texte, vous leur rendre la vie plus facile en fournissant une API qui leur permet de le faire en une seule étape. Et si vous trouvez que les développeurs ont souvent besoin également de créer des instances de MaClasse avec juste une chaîne de texte, vous pouvez également fournir une méthode -initWithText:.

Et si les instances créées de cette manière sont souvent utilisés comme des objets temporaires (et non stockées dans les variables d'instance ou variables statiques), vous pouvez également ajouter une méthode pratique de classe comme +myClassWithText: qui renvoie une instance autoreleased de MyClass initialisées avec la condition chaîne de texte.

à laquelle on est mieux: il est toujours préférable d'initialiser complètement un objet lorsque cela est possible, donc si l'objet a besoin des deux valeurs à être correctement initialisées, utilisez la méthode qui vous permet de fournir les deux arguments. Et si vous ne avez pas besoin de stocker une référence à l'instance que vous créez, utilisez la méthode pratique de classe pour que votre code ne doit pas faire face à la gestion de la mémoire.

Autres conseils

Si l'objet est inutilisable sans la longueur et le texte, puis la deuxième option pourrait être mieux. Si ces champs sont facultatifs, le premier est mieux.

Cependant, je ne pense pas qu'il y ait la vérité absolue à cette question.

Si vous avez une classe avec de nombreuses propriétés, il est très peu probable de les initialiser en une seule ligne de code. Les deux méthodes fonctionnent très bien pour moi.

Si une méthode de initWithSomething: est disponible et que vous souhaitez fournir des valeurs initiales pour ces propriétés, je préférerais toujours juste parce qu'il est plus simple. Il a également toujours fonctionner même avec des versions immuables d'une classe.

Mais aucune méthode d'initialisation est intrinsèquement « mieux ». Les cours ont généralement un ou deux initialiseurs désignés et tous les autres appellent seulement ceux qui ont des valeurs par défaut - il ne laisse pas nécessairement les propriétés de l'instance intacte. La documentation pour une classe doit indiquer ce que ses initializers font et qui est le initialiseur désigné pour la classe. Par exemple, [[NSDate alloc] init] utilise désigné initialiseur, initWithTimeIntervalSinceReferenceDate:, pour créer un objet date de NSDate représentant la date et l'heure.

Par ailleurs, cela signifie aussi que lorsque vous êtes une classe sous-classement, il vous suffit de remplacer son initialiseur désigné. Étant donné que les autres il suffit d'appeler, ils obtiennent votre nouveau comportement gratuitement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top