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?

¿Fue útil?

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];
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top