Question
Je le code suivant ci-dessous qui est destiné à changer une variable de classe appelée « aujourd'hui » d'un jour avant ou en arrière. Il travaillera un temps mais après qu'il se bloque. Il fera la même chose, peu importe si j'appuie sur le bouton gauche ou droite. Qu'est-ce que je fais mal?
Aujourd'hui var est une classe var initié comme aujourd'hui .. = [date NSDate]
Voici la méthode qui tombe en panne:
(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;
}
La solution
Non seulement avez-vous besoin de conserver la date de création, mais vous avez aussi besoin de libérer la valeur existante détenue par « aujourd'hui », sinon vous fuyez l'ancienne référence.
Lors de l'initialisation de l'instance, utilisez:
today = [[NSDate date] retain];
Je changerais la dernière ligne à:
[today release];
today = [newDay retain];
Et enfin, dans votre méthode dealloc, ajouter:
[today release];
avant d'appeler [super dealloc];
Autres conseils
Vous avez besoin de lire la documentation de gestion de la mémoire. C'est ici:
http://developer.apple.com /iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html
Si vous ajoutez ou soustraction de jours, vous pouvez lire ce qui est une autre façon de faire la même chose:
Enfin, si quelque chose tombe en panne, il est souvent utile de regarder les traces de dos (et les inclure dans vos questions si vous ne pouvez pas comprendre par vous-même). bogues de gestion de la mémoire sont généralement le problème si vous voyez objc_msgSend (ou l'un de ses compagnons) dans la trace.
Peut-être que vous devez dire
today = [[NSDate date] retain]
Je pense que vous devez retenir l'objet Newday retourné par la méthode addTimeInterval. Vous devrez peut-être libérer aujourd'hui avant de faire la cession à la fin.