[Obj-C] Devo usar alloc – init ou new? – FX LAB
Blog de desenvolvimento mobile
Publicado em 2 de maio de 2017 19 de maio de 2017 por renefx
[Obj-C] Devo usar alloc – init ou new?
MeuObjeto * instance = [[MeuObjeto alloc] init];
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.