Domanda

è uno di questi due modi per creare e inizializzare un oggetto preferibile?

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

o utilizzando un metodo di classe che contiene circa lo stesso codice, ma si presenta così:

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

Odio quando vedo le cose fatte più di un modo e non ho idea se uno è migliore rispetto agli altri, o perché!

È stato utile?

Soluzione

Non essere un nemico. : -)

A proposito, sto assumendo che volevi dire:

( Modifica calchi inutili rimossi)

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

La ragione per più di init ... metodi è quello di rendere più conveniente per gli sviluppatori di creare le istanze inizializzato correttamente. Così, per esempio, se si scopre che gli sviluppatori spesso hanno bisogno di creare istanze di MyClass con una lunghezza e di testo, è rendere la loro vita più facile, fornendo un'API che permette loro di farlo in un solo passaggio. E se si scopre che gli sviluppatori spesso anche bisogno di creare istanze di MyClass con solo una stringa di testo, si potrebbe anche fornire un metodo -initWithText:.

E se le istanze create in questo modo sono spesso utilizzati come oggetti temporanei (cioè, non memorizzati nelle variabili di istanza o variabili statiche), si potrebbe anche aggiungere un metodo di classe convenienza come +myClassWithText: che restituisce un'istanza autoreleased di MyClass inizializzate con il previsto stringa di testo.

Per quanto riguarda 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 c'è bisogno di memorizzare un riferimento all'istanza che si sta creando, utilizzare il metodo della classe convenienza modo che il codice non ha a che fare con la gestione della memoria.

Altri suggerimenti

Se l'oggetto è inutilizzabile, senza la lunghezza e il testo, quindi la seconda opzione potrebbe essere migliore. Se questi campi sono facoltativi, quindi il primo è meglio.

Tuttavia, non credo che ci sia una verità assoluta a questa domanda.

Se si dispone di una classe con molte proprietà è molto improbabile per inizializzare tutti in una sola riga di codice. Entrambi i modi funzionano bene per me.

Se un metodo initWithSomething: è disponibile e si desidera fornire i valori iniziali per queste proprietà, mi sarebbe sempre preferiscono solo perché è più semplice. Sarà anche sempre funzionare anche con le versioni immutabili di una classe.

Ma né metodo init è intrinsecamente "migliore". Le classi di solito hanno una o due inizializzatori designati e tutti gli altri lo chiamano quelli con valori di default - non lascia necessariamente proprietà dell'istanza intatta. La documentazione per una classe dovrebbe indicare quali sono i suoi inizializzatori fanno e che è l'inizializzatore designato per la classe. Ad esempio, utilizza [[NSDate alloc] init] di NSDate designato inizializzatore, initWithTimeIntervalSinceReferenceDate:, per creare un oggetto Date che rappresenta la data e l'ora corrente.

Per inciso, questo significa anche che quando si sta sottoclasse di una classe, avete solo bisogno di ignorare la sua inizializzatore designato. Dal momento che gli altri basta chiamare che, ottengono il vostro nuovo comportamento gratuitamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top