alloc
asigna un trozo de memoria para contener el objeto y devuelve el puntero.
MyClass* myObj = [MyClass alloc];
myObj
no se puede utilizar, sin embargo, debido a su estado interno no está correctamente configurado. Por lo tanto, no escriba un código como este.
init
establece la condición inicial del objeto y lo devuelve. Tenga en cuenta que lo que devuelve[a init]
puede ser diferente de a
. Eso explica el código Yannick escribió:
-init{
self=[super init]; // 1.
if(self){ // 2.
....
}
return self; // 3.
}
- En primer lugar, es necesario llamar a la superclase de
init
, para configurar las variables de instancia de la superclase, etc.Puede devolver algo que no sea igual al original self
, por lo que debe asignar lo que se devuelve al self
.
- Si
self
no es nulo, significa que la parte controlada por la superclase está correctamente inicializada. Ahora realiza su inicialización. Todas las variables de instancia están configuradas en nil
(si es un objeto) y 0
si es un número entero. Tendrá que realizar configuraciones iniciales adicionales.
- Devuelve la configuración
self
. ¡El self
devuelto puede ser diferente de lo que se asigna! Por lo tanto, debe asignar el resultado de init
a su variable.
Esta sugerencia una lección importante: no dividir la llamada a alloc
y init
. No escriba:
MyClass* myObj = [MyClass alloc];
[myObj init];
porque [myObj init]
podría devolver algo más. No trate de evitar esto mediante la escritura:
MyClass* myObj = [MyClass alloc];
myObj=[myObj init];
porque es muy probable que se olvide de escribir la parte myObj=
en la segunda línea.
siempre escribir:
MyClass* myObj = [[MyClass alloc] init];
Asimismo, no se recomienda escribir:
MyClass* myObj = [MyClass new];
porque no llama correctamente el método de inicialización: algunas clases no acepta una llanura init
. Por ejemplo, NSView
necesita initWithFrame:
, que no se puede llamar con new
. Por lo tanto, no use new
tampoco.
¡Buena explicación! Gracias –
Dicho esto, si no necesita un '-init' personalizado, puede llamar definitivamente a' + new'. Si miras la implementación de '+ (id) new', es literalmente' return [[self alloc] init]; ' –
Tengo una pregunta, Yuji. La variable myObj es un puntero a la ubicación de la memoria ¿verdad? Su punto "Primero, necesita llamar al init de la superclase, configurar las variables de instancia de la superclase, etc. Eso puede devolver algo que no es igual al auto original", entonces ¿quiere decir que en la superclase se asigna un nuevo objeto de nuevo debido a que el puntero a la ubicación de la memoria cambia? –