Pregunta

Es una de estas dos formas de crear e inicializar un objeto preferible?

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

o el uso de un método de clase que contiene aproximadamente el mismo código, pero se parece a esto:

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

Me odio cuando veo las cosas más de una forma y no tengo ni idea de si uno es mejor que el otro, o por qué!

¿Fue útil?

Solución

No sea un enemigo. : -)

Por cierto, estoy suponiendo que quería decir:

( Editar: retirados moldes innecesarios)

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

La razón de múltiples init ... métodos es hacer que sea más conveniente para los desarrolladores crear instancias inicializado correctamente. Así, por ejemplo, si usted encuentra que los desarrolladores a menudo necesitan para crear instancias de MyClass con una longitud y un texto, hacer su vida más fácil proporcionando una API que permite que lo hagan en un solo paso. Y si encuentra que los desarrolladores también con frecuencia necesitan para crear instancias de MyClass con sólo una cadena de texto, también puede proporcionar un método -initWithText:.

Y si las instancias creadas de esta manera se utilizan con frecuencia como objetos temporales (es decir, que no están almacenados en las variables de instancia o variables estáticas), es posible también añadir un método de conveniencia clase como +myClassWithText: que devuelve una instancia autoreleased de MiClase inicializado con la proporcionada cadena de texto.

En cuanto a cuál es mejor: siempre es mejor para inicializar un objeto totalmente cuando sea posible, de modo que si el objeto necesita que ambos valores se inician correctamente, utilice el método que le permite proporcionar ambos argumentos. Y si no es necesario almacenar una referencia a la instancia que está creando, utilice el método de conveniencia clase para que su código no tiene que ocuparse de la gestión de memoria.

Otros consejos

Si el objeto no se puede utilizar sin la longitud y el texto, a continuación, la segunda opción podría ser mejor. Si estos campos son opcionales, a continuación, el primero es mejor.

Sin embargo, creo que no hay verdad absoluta a esta pregunta.

Si usted tiene una clase con muchas propiedades Es muy poco probable para inicializar todos ellos en una sola línea de código. Ambas formas funcionan bien para mí.

Si un método initWithSomething: está disponible y desea proporcionar valores iniciales para esas propiedades, yo siempre lo prefieren sólo porque es más simple. También siempre funcionará incluso con versiones inmutables de una clase.

Sin embargo, ninguno de estos métodos init es intrínsecamente "mejor". Las clases suelen tener uno o dos inicializadores designados y todos los demás simplemente llaman a aquellos con valores por defecto - no necesariamente dejar las propiedades de la instancia sin tocar. La documentación para una clase debe indicar cuáles son sus inicializadores hacen y que es el inicializador designado para la clase. Por ejemplo, [[NSDate alloc] init] utiliza de NSDate designado inicializador, initWithTimeIntervalSinceReferenceDate:, para crear un objeto de fecha que representa la fecha y hora actuales.

Por cierto, esto también significa que cuando estás de subclases de una clase, sólo es necesario para anular su inicializador designado. Dado que los otros sólo exigen que se quedan con la nueva conducta de forma gratuita.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top