2010-07-25 16 views
46

Un libro para acerca de la programación iPhone instancia clases como esto:alloc, inicio y nuevo en Objective-C

[[Class alloc] init] 

Otro libro sobre Objective-C hace como este:

[Class new] 

Lo que es ¿la diferencia?

+0

¿Qué pasa con '[NSMutableDictionary dictionary];' – abhi1992

Respuesta

67

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 casi, pero no del todo obsoleto: por lo tanto, verás que las clases de Cocoa tienen muchos métodos de inicio pero casi nunca ningún método nuevo personalizado.

+30

Podría mostrar o citar dónde + nuevo es "casi-pero-no-bastante obsoleto". Me gustaría tener la información antes de hablar con colegas. – acarlow

+2

Lo uso como atajo cuando lo único que quiero hacer es llamar a 'alloc' /' init'. – Rivera

+0

¿Qué pasa con [NSMutableDictionary dictionary]; – abhi1992

2

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

+1

"alloc" crea una nueva ubicación de memoria pero no la inicializa en comparación con "nueva". –

13

Como ya se mencionó, por defecto no hay diferencia. Pero puede sobrescribir el método de clase new. Apple's documentation tiene algunas ideas sobre esto.

A diferencia alloc, nueva es a veces re-implementado en subclases para invocar una inicialización método específico de clase [...] A menudo ... nuevos métodos hacer algo más que solo la asignación y la inicialización .

+2

No veo el extracto en su enlace. ¿Podría ubicar su fuente, por favor? – acarlow

+0

Obviamente, Apple ha actualizado los documentos y eliminado ese párrafo. Puede encontrar copias de versiones anteriores en la web (no estoy seguro sobre derechos de autor ...) – user123444555621

70

+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:.

Cuestiones relacionadas