alloc, init e new em Objective-C

Um livro sobre a programação do iPhone instancia classs como esta:

[[Class alloc] init] 

Outro livro sobre o Objective-C faz assim:

 [Class new] 

Qual é a diferença?

Originalmente em Objective-C, os objects foram criados com o novo. À medida que o framework OpenStep / Cocoa evoluiu, os designers desenvolveram a opinião de que alocar memory para um object e inicializar seus atributos eram preocupações separadas e, portanto, deveriam ser methods separados (por exemplo, um object poderia ser alocado em uma zona de memory específica). Então, o estilo aloc-init de criação de objects veio a favor.

Basicamente, o novo é antigo e quase-mas-não-totalmente obsoleto – assim você verá que as classs Cocoa possuem muitos methods init, mas quase nunca novos methods customizados.

+new é implementado literalmente como:

 + (id) new { return [[self alloc] init]; } 

Nada mais nada menos. As classs podem sobrescrevê-lo, mas isso é altamente atípico em favor de fazer algo como +fooWithBar:

Como já mencionado, por defaut não há diferença. Mas você pode sobrescrever o new método de class. A documentação da Apple tem alguns pensamentos sobre isso.

Ao contrário da alocação , o novo é algumas vezes reimplementado em subclasss para invocar um método de boot específico da class. […] Freqüentemente novos methods irão fazer mais do que apenas alocação e boot.

Depende da Classe, mas [Class new] é provavelmente um método de conveniência que chama [[Class alloc] init] internamente. Assim, você não pode chamar outros methods init, como “initWithString”.