ultima tutorial objective logo espaƱol objective-c

objective c - tutorial - alloc, init y nuevo en Objective-C



objective c vs c++ (4)

Esta pregunta ya tiene una respuesta aquí:

Un libro sobre la programación de iPhone crea instancias de clases como esta:

[[Class alloc] init]

Otro libro sobre Objective-C lo hace así:

[Class new]

¿Cual es la diferencia?


Como ya se mencionó, por defecto no hay diferencia. Pero puedes sobreescribir el new método de clase. La documentación de Apple tiene algunas ideas sobre esto.

A diferencia de alloc , lo nuevo a veces se vuelve a implementar en subclases para invocar un método de inicialización [...] específico de clase. A menudo, los nuevos métodos ... harán algo más que la asignación y la inicialización.


Depende de la Clase, pero [Class new] es muy probablemente un método de conveniencia que llama [[Class alloc] init] internamente. Por lo tanto, no puede llamar a otros métodos de inicio como "initWithString".


Originalmente en Objective-C, los objetos se crearon con nuevos. A medida que evolucionó el marco OpenStep / Cocoa, los diseñadores desarrollaron la opinión de que asignar memoria para un objeto e inicializar sus atributos eran preocupaciones separadas y por lo tanto deberían ser métodos separados (por ejemplo, un objeto podría asignarse en una zona de memoria específica). Por lo tanto, el estilo alloc-init de la creación de objetos se hizo popular.

Básicamente, lo nuevo es viejo y está casi obsoleto, por lo que verá que las clases de Cocoa tienen muchos métodos de inicio, pero casi nunca tienen métodos nuevos personalizados.


+new se implementa literalmente como:

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

Nada más y nada menos. Las clases pueden anularlo, pero eso es muy atípico a favor de hacer algo como +fooWithBar: