Domanda
Ho il seguente codice sotto che è destinato a cambiare una var classe chiamata "oggi" in avanti o indietro di un giorno. Essa opererà una sola volta, ma poi, dopo che si blocca. Si farà lo stesso, non importa se si preme il tasto sinistro o il pulsante destro. Che cosa sto facendo di sbagliato?
var oggi è una classe var avviato .. oggi = [data NSDate]
Ecco il metodo che si blocca:
(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;
}
Soluzione
Non solo è necessario per mantenere la data di creazione, ma è anche necessario per liberare il valore esistente detenuto da "oggi", altrimenti si fuoriuscire il vecchio riferimento.
Quando si inizializza l'istanza, utilizzare:
today = [[NSDate date] retain];
Vorrei cambiare l'ultima riga a:
[today release];
today = [newDay retain];
E, infine, nel metodo dealloc, aggiungere:
[today release];
prima di chiamare [super dealloc];
Altri suggerimenti
È necessario leggere la documentazione di gestione della memoria. Ecco qui:
http://developer.apple.com /iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html
Se si sta aggiungendo o sottraendo giorni, si potrebbe desiderare di leggere questo, che è un modo alternativo di fare la stessa cosa:
Infine, se qualcosa si blocca, è spesso utile per guardare le tracce posteriori (e includerli nelle vostre domande, se non si riesce a capire fuori per lei). bug di gestione della memoria sono di solito il problema se si vede objc_msgSend (o uno dei suoi compagni) nella traccia.
Forse avete bisogno di dire
today = [[NSDate date] retain]
Credo che è necessario mantenere l'oggetto Newday restituito dal metodo addTimeInterval. Potrebbe anche essere necessario per rilasciare oggi prima di fare l'assegnazione alla fine.