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;

}

È stato utile?

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:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtCalendricalCalculations.html#//apple_ref/doc/uid/TP40007836-SW1

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top