No seas 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 métodos init ... es hacer es más conveniente para los desarrolladores crear instancias correctamente inicializadas. Entonces, por ejemplo, si descubre que los desarrolladores a menudo necesitan crear instancias de MyClass con una longitud y un texto, les facilita la vida al proporcionarles una API que les permite hacer eso en un solo paso. Y si encuentra que los desarrolladores también necesitan crear instancias de MyClass con solo 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, no se almacenan en variables de instancia o estáticas), también puede agregar un método de clase conveniente como +myClassWithText:
que devuelve una instancia autorizada de MyClass inicializada con el proporcionado cadena de texto.
En cuanto a cuál es mejor: siempre es mejor inicializar por completo un objeto cuando sea posible, de modo que si el objeto necesita que ambos valores se inicialicen correctamente, utilice el método que le permite proporcionar ambos argumentos. Y si no necesita almacenar una referencia a la instancia que está creando, use el método de conveniencia de clase para que su código no tenga que lidiar con la administración de memoria.
¿Quiere decir [MyClass myClassWithLength: ...? – Ross
Nunca hay un método de clase que se llamará 'initWith ...' - los métodos init son siempre métodos de instancia. Siempre será '[[MyClass alloc] initWith ...]'. Sin embargo, las clases a veces ofrecen constructores de conveniencia como Ross. Solo para aclarar. – Chuck