Pergunta

É uma dessas duas maneiras de criar e inicializar um preferível objeto?

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

ou usando um método de classe que contém aproximadamente o mesmo código, mas parece com isso:

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

Eu odeio quando vejo as coisas mais de uma maneira e eu não tenho idéia se um é melhor que o outro, ou porquê!

Foi útil?

Solução

Do not seja um aborrecedor. : -)

A propósito, eu estou supondo que você quis dizer:

( Editar: moldes desnecessários removidos)

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

A razão para vários inicialização ... métodos é torná-lo mais conveniente para os desenvolvedores para criar instâncias devidamente inicializado. Assim, por exemplo, se você achar que os desenvolvedores geralmente precisam para criar instâncias de MyClass com um comprimento e texto, você tornar sua vida mais fácil, fornecendo uma API que permite que eles façam isso em uma única etapa. E se você achar que os desenvolvedores também frequentemente precisam criar instâncias de MyClass com apenas uma cadeia de texto, você também pode fornecer um método -initWithText:.

E se as instâncias criadas dessa forma são freqüentemente usados ??como objetos temporários (ou seja, não armazenados em variáveis ??de instância ou variáveis ??estáticos), você pode também adicionar um método de classe de conveniência como +myClassWithText: que retorna uma instância autoreleased de MyClass inicializado com o fornecido texto de cadeia.

Quanto ao qual é melhor: é sempre melhor totalmente inicializar um objeto quando possível, por isso, se o objeto precisa ambos os valores para ser devidamente inicializado, use o método que permite fornecer ambos os argumentos. E se você não precisa armazenar uma referência para a instância que você está criando, use o método classe de conveniência para que o seu código não tem que lidar com o gerenciamento de memória.

Outras dicas

Se o objeto está inutilizável sem o comprimento e texto, em seguida, a segunda opção poderia ser melhor. Se esses campos são opcionais, então o primeiro é melhor.

No entanto, eu não acho que há verdade absoluta a esta questão.

Se você tem uma classe com muitas propriedades é muito improvável para inicializar todos eles em uma única linha de código. Ambas as formas funcionam bem para mim.

Se um método initWithSomething: está disponível e você quiser fornecer valores iniciais para essas propriedades, eu sempre preferi-lo apenas porque é mais simples. Ele também irá funcionar sempre, mesmo com versões imutáveis ??de uma classe.

Mas nem método init é inerentemente "melhor". As aulas geralmente têm um ou dois inicializadores designados e todos os outros apenas chamar aqueles com valores padrão - não necessariamente deixar propriedades da instância intocado. A documentação para uma classe deve indicar quais os seus initializers fazer e que é o designado initializer para a classe. Por exemplo, [[NSDate alloc] init] usa de NSDate designado initializer, initWithTimeIntervalSinceReferenceDate:, para criar um objeto data que representa a data e hora atual.

Aliás, isso também significa que quando você está subclasse uma classe, você só precisa substituir seu inicializador designado. Uma vez que os outros apenas chamar isso, eles obter o seu novo comportamento para livre.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top