Uso de alloc init en lugar de nuevo
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?
Hay varias razones aquí: http://macresearch.org/difference-between-alloc-init-and-new
Algunos seleccionados son:
new
no admite inicializadores personalizados (comoinitWithString
)alloc-init
es más explícito quenew
La opinión general parece ser que debes usar lo que te resulte más cómodo.
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...
+new
es equivalente a +alloc/-init
en 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 +new
parece 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
.
Con frecuencia, necesitará pasar argumentos a init
y, 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]
.