objective c - tutorial - alloc, init y nuevo en Objective-C
objective c vs c++ (4)
Esta pregunta ya tiene una respuesta aquí:
- Uso de alloc init en lugar de nuevas 8 respuestas
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: