Non essere un nemico. :-)
A proposito, sto supponendo che volevi dire:
(Edit: rimossi calchi inutili)
MyClass oClass = [[MyClass alloc] initWithLength:5 andText:@"Hello"];
La ragione per più di init ... metodi è quello di rendere è più conveniente per gli sviluppatori creare istanze correttamente inizializzate. Ad esempio, se scopri che gli sviluppatori spesso hanno bisogno di creare istanze di MyClass con una lunghezza e un testo, ti semplifichi la vita fornendo un'API che permetta loro di farlo in un unico passaggio. E se scopri che spesso gli sviluppatori devono creare istanze di MyClass con solo una stringa di testo, potresti anche fornire un metodo -initWithText:
.
E se le istanze create in questo modo sono spesso utilizzate come oggetti temporanei (cioè non memorizzate in variabili di istanza o variabili statiche), è anche possibile aggiungere un metodo di classe come +myClassWithText:
che restituisce un'istanza autorizzata di MyClass inizializzata con fornito stringa di testo
Quanto al quale è meglio: è sempre meglio di inizializzare completamente un oggetto quando è possibile, quindi, se l'oggetto deve entrambi i valori di essere correttamente inizializzato, utilizzare il metodo che consente di fornire entrambi gli argomenti. E se non hai bisogno di memorizzare un riferimento all'istanza che stai creando, usa il metodo di classe di convenienza in modo che il tuo codice non debba occuparsi della gestione della memoria.
intendi [MyClass myClassWithLength: ...? – Ross
Non c'è mai un metodo di classe che verrà chiamato 'initWith ...' - i metodi init sono sempre metodi di istanza. Sarà sempre '[[MyClass alloc] initWith ...]'. Le classi a volte offrono dei costruttori di convenienza come quelli di Ross, però. Giusto per essere chiari. – Chuck