[Obj-C] Devo usar alloc – init ou new?

MeuObjeto * instance = [[MeuObjeto alloc] init];
VS
MeuObjeto * instance = [MeuObjeto new];

Usar o alloc-init pra mim sempre foi muito grande e usar o new me trazia dúvidas sobre a equivalência dos dois métodos. Pra tirar a dúvida, fui buscar diretamente na documentação do Objective-C.

  • alloc – reserva (aloca) um espaço de memória para guardar o objeto e retorna um instancetype.
  • init – init chama o construtor sem argumentos do objeto e, se o objeto foi inicializado. corretamente, é retornado um tipo instancetype.

A própria documentação da Apple recomenda que o método alloc não seja sobreescrito para incluir o código do construtor. A documentação também afirma que é necessário executar logo em seguida o método init para completar o processo de inicialização do objeto.
Como não é possível determinar se o retorno do alloc é do tipo do objeto que você deseja, o retorno do alloc já é enviado para o init. Por isso é ensinado assim:

MeuObjeto* meuObjeto = [[MeuObjeto alloc] init];
  • new – reserva (aloca) um espaço de memória para guardar o objeto, envia o resultado para o método init e retorna o objeto inicializado.

Nesse caso a documentação da Apple diz que o new é exatamente a combinação dos métodos alloc e init, sendo assim equivalente.

MeuObjeto* meuObjeto = [MeuObjeto new];

Um detalhe do uso do new é que ele sempre irá executar o init. Isso afeta na prática quando você quer utilizar um construtor diferente do construtor sem argumentos, pois não existirá esse construtor com o new. Por exemplo, caso você queira criar uma NSString * com um formato, você utilizará o método initWithFormat, porém não existe um método newWithFormat.

NSString *minhaNSString = [[NSString alloc] initWithFormat:@"formato"];

Para manter  o código com um único método e não ter que avaliar qual dos dois usar, de modo geral, a comunidade Objective-C evita o uso do new. O uso do new é mais comum por aqueles que vêm do desenvolvimento Java.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s