2013-07-05 3 views
1

J'ai cherché SO parmi d'autres forums pour la réponse à cela, mais quoi que j'essaie, il ne semble pas se débarrasser de ma fuite de mémoire. Quelqu'un a-t'il des suggestions?NSDate fuite de mémoire

Je reçois une fuite de mémoire de 16 octets par NSDate dans mon ViewController chaque fois que je le présente.

-(void)initialise:(id)sender withDate:(NSDate *)date withMinimumDate:(NSDate *)minimum { 
    delegate = sender; 
    self.originalDate = [[NSDate alloc] init]; 
    self.originalDate = date; 

    self.minimumDate = [[NSDate alloc] init]; 
    self.minimumDate = minimum; 
} 

- (void)dealloc { 
    [self.originalDate release]; 
    [self.minimumDate release]; 

    [super dealloc]; 
} 

J'ai essayé de diffuser et/ou de faire les NSDates nil avant de les répartir pour la première fois, et les mettre à zéro dans la méthode dealloc.

Elles sont déclarées propriétés non-atomiques et conservées dans l'en-tête.

Ai-je manqué quelque chose de basique ici ou y a-t-il une réponse plus complexe?

+0

utilisez-vous ARC ou la gestion manuelle de la mémoire? – utahwithak

+0

@Rob Noté, merci. – Ollie

Répondre

2

Vous faites un alloc/init d'un NSDate pour originalDate, mais immédiatement l'abandonner et le mettre égal au paramètre date, une fuite peut-être la NSDate vous avez créé. Vous faites cela avec minimumDate, aussi.

Au minimum, retirer ces deux lignes qui font le alloc/init des deux objets NSDate respectifs que vous abandonnons ultérieurement en faveur des paramètres à la méthode initialise.


D'ailleurs, ce problème (et le problème dealloc) auraient été mis en évidence pour vous si vous travaillez l'analyseur statique (« Analyse » dans le menu « Produit » ou appuyez sur changement + commande + B):

static analyzer

Lors de l'écriture du code de comptage de référence manuelle, l'analyseur statique est précieux pour identifier les problèmes. Vous devriez vraiment avoir un bilan de santé propre de l'analyseur. Vous pouvez cliquer sur les icônes bleues et il se développera souvent avec les descriptions et les flèches que je montre dans l'instantané d'écran ci-dessus. Remarque: cela a également mis en évidence l'utilisation inappropriée de self.originalDate (au lieu de _originalDate, ou quelle que soit la variable d'instance de sauvegarde) dans votre méthode dealloc. Comme je l'ai mentionné dans mon commentaire précédent, vous should not use accessor methods in dealloc method.

+0

Il semble que les différences entre ARC et MRC me confondaient à cette occasion. Merci beaucoup monsieur. – Ollie

+0

@Ollie Je vous encourage à consulter l'analyseur statique, qui permettra d'identifier ce genre de problèmes pour vous dans le futur. C'est un bon outil, et inestimable si vous faites MRC. Voir ma réponse révisée. – Rob

0

Ces deux lignes créent des références à des objets qui ne sont jamais libérés.

self.originalDate = [[NSDate alloc] init]; 

self.minimumDate = [[NSDate alloc] init]; 

Voyant que vous écrasez instantanément ces propriétés avec de nouvelles valeurs, il vous suffit de supprimer ces deux lignes (qui allouent NSDate objets redondants ne sont jamais utilisés) et votre fuite devrait disparaître.

Vous devez également vérifier si le délégué est correctement géré en mémoire, car je ne vois aucune version dans dealloc pour la variable de délégué.

+0

Pour ce qui est de 'delegate', vous avez raison. Mais s'il a un [cycle de conservation] (https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447-1000810) , essayant de libérer cela dans 'dealloc' pourrait ne pas le résoudre (parce que' dealloc' n'est pas appelé tant que le nombre de retenues de l'objet n'est pas égal à zéro, c'est-à-dire tant que le cycle de conservation n'a pas été résolu). Il est souvent préférable de s'assurer que la propriété 'delegate' est' faible'/'assign', évitant ainsi tout risque de cycle de rétention. Cela dépend simplement de la façon dont 'delegate' a été déclaré. – Rob

+0

Oui, il est susceptible d'être affecté. Je pensais juste le signaler au cas où ça ne l'était pas, parce que je vois que Ollie a choisi de ne pas utiliser d'accesseurs de propriété, donc ça n'a peut-être pas été assigné accidentellement. –