Pergunta

Eu tenho um objeto NSDate criado por

NSDate *date = [[NSDate alloc] init];

Mais tarde, eu quero redefinir a data para o "agora", então eu pensei que

[date init];

ou

date = [date init];

pode fazer o trabalho, mas eles não. Em vez disso,

[date release];
date = [[NSDate alloc] init];

funciona. Estou um pouco confuso sobre isso, já que na documentação para - (id) init, ele diz:

Retorna um objeto NSDate inicializado para a data e hora atual.

e desde date já está alocado, não deveria só precisa de uma mensagem de init?

Foi útil?

Solução

Pense alloc e init como metades logicamente inseparáveis ??de um construtor. Você só pode chamar métodos começando com "init" uma vez em um determinado objeto - uma vez que o objeto foi inicializado, e é um erro para inicializar-lo novamente. Isto é verdade para qualquer objeto Objective-C, não apenas NSDate. No entanto, objetos NSDate também são imutável -. Uma vez criados, eles não podem mudar

A razão o último código funciona é porque você está criando uma nova instância do NSDate, que é a coisa correta a fazer. Você também pode usar [data NSDate] para realizar a mesma coisa. Esteja ciente de que ele retorna um objeto que você não (ainda) própria, então você vai precisar para retê-lo se você precisa mantê-lo ao redor, e soltá-lo mais tarde.

Esteja ciente de que se você receber um objeto de alguém, já foi inicializado. (Se não, é um erro de programação no código que desde que, ou é uma exceção extremamente incomum para a regra.)

Outras dicas

Se você deseja obter a data atual você pode apenas usar:

NSDate * now = [NSDate date];

Se você quiser mantê-lo, em seguida, retain-lo.

NSDate * now = [[NSDate date] retain];

Você não pode NSDate de reposição com o init, init é apenas para inicializar o objeto pela primeira vez.

Você poderia simplesmente pegar outra data:

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];

A mensagem de retorno date autoreleased exemplo de NSDate, daí a release ou autorelease.

O autorelease é usado para casos em que você não quer se preocupar com onde exatamente você precisa para liberar o objeto - é colocado em autorelease pool. Objeto na piscina disparo automático são liberados após o término do evento iteração do loop, ou quando você chamar de liberação na piscina ... (ver mais em docs da Apple sobre o gerenciamento de memória).

Btw. o [NSDate date] é um método de conveniência é provavelmente algo como (não quaranteed ser exatamente o mesmo, mas funcionalmente semelhante ao):

- (NSDate *)date
{
    return [[[NSDate alloc] init] autorelease];
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top