Pregunta
Tengo el siguiente código a continuación que está destinado a cambiar una var clase llamada "hoy" delante o hacia atrás por un día. Se trabajará una vez, pero después de eso se bloquea. Se hará lo mismo no importa si presiono el botón izquierdo o el botón derecho. ¿Qué estoy haciendo mal?
var var hoy es una clase que inició hoy .. = [fecha NSDate]
Este es el método que se estrella:
(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;
}
Solución
No sólo se necesita para conservar la fecha creada, pero también es necesario para liberar el valor existente en poder de "hoy", de lo contrario tendrá fugas El viejo referencia.
Al inicializar la instancia, utilice:
today = [[NSDate date] retain];
Me gustaría cambiar la última línea a:
[today release];
today = [newDay retain];
Y, por último, en su método dealloc, añadir:
[today release];
antes de llamar [súper dealloc];
Otros consejos
Es necesario leer la documentación de gestión de memoria. Eso es aquí:
http://developer.apple.com /iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html
Si va a añadir o restar días, es posible que desee leer esto que es una forma alternativa de hacer la misma cosa:
Por último, si algo falla, a menudo es útil observar las huellas de la espalda (e incluirlos en sus preguntas si no puede resolverlo por sí mismo). errores de gestión de memoria son por lo general el problema si ves objc_msgSend (o uno de sus compañeros) en la traza.
Tal vez lo que necesita decir
today = [[NSDate date] retain]
Creo que es necesario para retener el objeto de regresar de newDay el método addTimeInterval. También puede ser necesario para liberar hoy antes de hacer la asignación al final.