Frage
Ich habe den folgenden Code unter dem gemeint ist eine Klasse var ändern „heute“ genannt vorwärts oder rückwärts von einem Tag. Es wird eine Zeit arbeiten, aber dann nach, dass es abstürzt. Es wird das gleiche tun, egal, ob ich die linke Taste oder rechte Taste drücken. Was mache ich falsch?
die var heute ist eine Klasse var initiiert wie .. heute = [NSDate Datum]
Hier ist die Methode, die Abstürze:
(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;
}
Lösung
Nicht nur müssen Sie das Datum erstellt behalten, aber Sie müssen auch gehalten den vorhandenen Wert lösen „heute“, sonst werden Sie das alte Referenzleck.
Wenn Sie die Instanz zu initialisieren, verwenden Sie:
today = [[NSDate date] retain];
Ich würde die letzte Zeile ändern:
[today release];
today = [newDay retain];
Und schließlich in Ihrer dealloc Methode hinzufügen:
[today release];
vor dem Aufruf von [super dealloc];
Andere Tipps
Sie müssen die Speicherverwaltung Dokumentation lesen. Das ist hier:
http://developer.apple.com /iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html
Wenn Sie das Hinzufügen oder Tage subtrahieren, mögen Sie vielleicht, dies zu lesen, das ist eine alternative Möglichkeit, das gleiche zu tun:
Schließlich, wenn etwas abstürzt, ist es oft hilfreich, auf der Rückseite Spuren suchen (und sie in Fragen, wenn Sie es nicht für sich selbst herausfinden können). Speicherverwaltung Fehler sind in der Regel das Problem, wenn Sie objc_msgSend (oder einen seiner Begleiter) in der Spur zu sehen.
Vielleicht müssen Sie sagen,
today = [[NSDate date] retain]
Ich glaube, Sie brauchen das Newday Objekt aus der addTimeInterval-Methode zurück behalten. Sie können sich auch heute freigeben müssen, bevor Sie die Zuordnung am Ende tun.