pregunta NSDate init, relacionada con la gestión de memoria en Objective-C
-
11-09-2019 - |
Pregunta
Tengo un objeto creado por NSDate
NSDate *date = [[NSDate alloc] init];
Más tarde, quiero que reajustar la fecha para el "ahora", así que pensé que
[date init];
o
date = [date init];
podría hacer el trabajo, pero no lo hacen. En su lugar,
[date release];
date = [[NSDate alloc] init];
funciona. Estoy un poco confundido acerca de esto, ya que en la documentación de - (id) init
, que dice:
Devuelve un objeto NSDate inicializado a la fecha y hora actuales.
y desde date
ya está asignado, en caso de que no sólo tiene un mensaje de init
?
Solución
Piense en alloc
y init
mitades como lógicamente inseparables de un constructor. Sólo se puede llamar a los métodos que comienzan con "init" una vez en un objeto determinado - una vez que el objeto ha sido inicializado, y es un error para inicializar de nuevo. Esto es cierto para cualquier objeto de Objective-C, no sólo NSDate. Sin embargo, los objetos son también NSDate inmutable -. Una vez creados, no pueden cambiar
La razón por la que funciona el código de este último se debe a que va a crear una nueva instancia de NSDate, que es lo correcto a hacer. También puede utilizar [fecha NSDate] para obtener el mismo resultado. Ten en cuenta que devuelve un objeto que no lo hace (todavía) propia, por lo que necesita para retenerlo si es necesario para mantenerlo alrededor, y lo liberan más tarde.
Tenga en cuenta que si recibe un objeto de alguien, ya ha sido inicializado. (Si no es así, se trata de un error de programación en el código que siempre que, o es una excepción muy poco común a la regla.)
Otros consejos
Si desea obtener la fecha actual sólo se puede utilizar:
NSDate * now = [NSDate date];
Si desea mantenerlo a continuación retain
él.
NSDate * now = [[NSDate date] retain];
No se puede reiniciar NSDate
con init, init es sólo para inicializar el objeto por primera vez.
Se podía conseguir otra fecha:
NSDate * now = [[NSDate date] retain];
// use the now object
// need new date
[release now];
now = [[NSDate date] retain];
// once you don't need it release it
[now release];
El mensaje date
devuelve ejemplo autoreleased
de NSDate
, de ahí el release
o autorelease
.
El autorelease
se utiliza para los casos en que no desea que preocuparse acerca de dónde exactamente se necesita soltar el objeto - que se pone en autorelease pool
. Objeto de la piscina autorelease se liberan después del final del evento iteración del bucle, o cuando se llama a la liberación de la piscina ... (ver más en documentos de Apple sobre la gestión de memoria).
Por cierto. la [NSDate date]
es un método de conveniencia que es probablemente algo similar (no quaranteed a ser exactamente lo mismo pero funcionalmente similares a):
- (NSDate *)date
{
return [[[NSDate alloc] init] autorelease];
}