objective-c oop

objective c - Uso de alloc init en lugar de nuevo.



objective-c oop (8)

Al aprender Objective-C y leer el código de muestra, me doy cuenta de que los objetos generalmente se crean utilizando 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?


Como nota al margen, personalmente uso [Foo new] si quiero que se haga algo en init sin usar su valor de retorno en cualquier lugar. Si no usa la devolución de [[Foo alloc] init] cualquier lugar, recibirá una advertencia. Más o menos, uso [Foo new] para los ojos dulces.


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


Hay un montón de razones aquí: http://macresearch.org/difference-between-alloc-init-and-new

Algunos seleccionados son:

  • new no admite inicializadores personalizados (como initWithString )
  • alloc-init es más explícito que new

La opinión general parece ser que debes usar cualquier cosa con la que te sientas cómodo.


Llego muy tarde a esto, pero quiero mencionar que lo nuevo es realmente inseguro en el Obj-C con el mundo Swift. Swift solo creará un método de inicio predeterminado si no crea ningún otro inicializador. Llamar al nuevo en una clase rápida con un inicializador personalizado causará un bloqueo. Si usa alloc / init, el compilador se quejará correctamente de que init no existe.


Muy antigua pregunta, pero he escrito algunos ejemplos solo por diversión, tal vez lo encuentres ú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 afirmaciones:

[[InitAllocNewTest alloc] init];

y

[InitAllocNewTest new];

resultado 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...


Si el nuevo hace el trabajo por usted, entonces también hará su código un poco más pequeño. Si de otra manera llamaría [[SomeClass alloc] init] en muchos lugares diferentes de su código, creará un punto caliente en la implementación del nuevo, es decir, en el tiempo de ejecución de objc, que reducirá el número de fallas de su caché.

A mi entender, si necesita usar un inicializador personalizado, use [[SomeClass alloc] initCustom] .

Si no lo hace, use [SomeClass new] .


Una respuesta corta es:

  1. Ambos son lo mismo. Pero
  2. ''new'' solo funciona con el inicializador ''init'' básico, y no funcionará con otros inicializadores (por ejemplo, initWithString :).

+new es equivalente a +alloc/-init en la implementación NSObject de Apple. Es muy poco probable que esto cambie alguna vez, pero dependiendo de su nivel de paranoia, la documentación de Apple para +new parece permitir un cambio de implementación (y romper la equivalencia) en el futuro. Por esta razón, debido a que "explícito es mejor que implícito" y por continuidad histórica, la comunidad de Objective-C generalmente evita +new . Sin embargo, por lo general, puede detectar a los participantes recientes de Java en Objective-C por su uso persistente de +new .