NSDate questão de inicialização, relacionada com o gerenciamento de memória em Objective-C
-
11-09-2019 - |
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
?
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];
}