Pergunta
Eu tenho o seguinte código abaixo que se destina a alterar um var classe chamada "hoje" frente ou para trás por um dia. Ele vai trabalhar uma vez, mas depois disso ele trava. Ele vai fazer a mesma matéria sem se eu pressionar o botão esquerdo ou o botão direito. O que estou fazendo de errado?
o var hoje é um var classe iniciado como .. hoje = [data NSDate]
Aqui está o método que deixe de funcionar:
(IBAction)changeDateByOne:(id)sender{
NSDate *newDay;
NSDate *currentDay = today;
NSTimeInterval secondsPerDay = 24 * 60 * 60;
if(sender == leftButton){
newDay = [currentDay addTimeInterval:-secondsPerDay];
}else if(sender == rightButton) {
newDay = [currentDay addTimeInterval: secondsPerDay];
}
today = newDay;
}
Solução
Não só você precisa para manter a data de criação, mas você também precisa liberar o valor existente detido por "hoje", caso contrário você vai vazar a referência de idade.
Ao inicializar a instância, use:
today = [[NSDate date] retain];
Gostaria de mudar a última linha para:
[today release];
today = [newDay retain];
E, finalmente, em seu método dealloc, adicione:
[today release];
antes de chamar [super-dealloc];
Outras dicas
Você precisa ler a documentação de gerenciamento de memória. Isso é aqui:
http://developer.apple.com /iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html
Se você está adicionando ou subtraindo dias, você pode querer ler este que é uma forma alternativa de fazer a mesma coisa:
Por fim, se algo falhar, muitas vezes é útil olhar para os vestígios de volta (e incluí-los em suas perguntas se você não pode descobrir por si mesmo). erros de gerenciamento de memória são geralmente o problema se você ver objc_msgSend (ou um de seus companheiros) no rastreio.
Talvez você precisa dizer
today = [[NSDate date] retain]
Eu acho que você precisa para manter o objeto NewDay retornado do método addTimeInterval. Você também pode precisar para liberar hoje antes de fazer a atribuição no final.