Uso de alloc init en lugar de nuevo

Resuelto willc2 asked hace 15 años • 8 respuestas

Al aprender Objective-C y leer código de muestra, noto que los objetos generalmente se crean usando este método:

SomeObject *myObject = [[SomeObject alloc] init];

en lugar de:

SomeObject *myObject = [SomeObject new];

¿Hay alguna razón para esto, ya que he leído que son equivalentes?

willc2 avatar Apr 06 '09 06:04 willc2
Aceptado

Hay varias razones aquí: http://macresearch.org/difference-between-alloc-init-and-new

Algunos seleccionados son:

  • newno admite inicializadores personalizados (como initWithString)
  • alloc-inites más explícito quenew

La opinión general parece ser que debes usar lo que te resulte más cómodo.

Jeremy Stanley avatar Apr 05 '2009 23:04 Jeremy Stanley

Pregunta muy antigua, pero he escrito un ejemplo solo por diversión; tal vez te resulte útil;)

#import "InitAllocNewTest.h"

@implementation InitAllocNewTest

+(id)alloc{
    NSLog(@"Allocating...");
    return [super alloc];
}

-(id)init{
    NSLog(@"Initializing...");
    return [super init];
}

@end

En función principal ambas declaraciones:

[[InitAllocNewTest alloc] init];

y

[InitAllocNewTest new];

resulta en el mismo resultado:

2013-03-06 16:45:44.125 XMLTest[18370:207] Allocating...
2013-03-06 16:45:44.128 XMLTest[18370:207] Initializing...
radekEm avatar Mar 06 '2013 15:03 radekEm

+newes equivalente a +alloc/-initen la implementación de Apple NSObject. Es muy poco probable que esto cambie alguna vez, pero dependiendo de su nivel de paranoia, la documentación de Apple +newparece permitir un cambio de implementación (y romper la equivalencia) en el futuro. Por esta razón, porque "explícito es mejor que implícito" y por continuidad histórica, la comunidad Objective-C generalmente lo evita +new. Sin embargo, normalmente se puede detectar a los recién llegados a Objective-C en Java por su uso tenaz de +new.

Barry Wark avatar Apr 06 '2009 02:04 Barry Wark

Con frecuencia, necesitará pasar argumentos a inity, por lo tanto, utilizará un método diferente, como [[SomeObject alloc] initWithString: @"Foo"]. Si estás acostumbrado a escribir esto, adquirirás el hábito de hacerlo de esta manera y, por lo tanto, [[SomeObject alloc] init]puede resultarte más natural [SomeObject new].

Brian Campbell avatar Apr 05 '2009 23:04 Brian Campbell