2008-11-01 16 views
1

J'ai beaucoup de problèmes avec les objets NSDate qui sont désaffectés prématurément. Je soupçonne que les problèmes peuvent être liés à la façon dont je traite les objets retournés à partir des méthodes de commodité NSDate. Je pense que que ma déclaration de propriété showDate dans la classe JKShow devrait être "conserver", mais le changer pour assigner ou copier semble n'avoir aucun effet sur le problème.Traiter les objets retournés par les méthodes de commodité du cacao

JKShow *show; 
NSDate *date; 
NSMutableArray *list = [[NSMutableArray alloc] init]; 

// Show 1 
show = [[JKShow alloc] init]; 
//... 
date = [gregorian dateFromComponents:dateComponents]; 
show.showDate = date; 
[list addObject:[show autorelease]]; 

// Show 2 
show = [[JKShow alloc] init]; 
//... 
date = [gregorian dateFromComponents:dateComponents]; 
show.showDate = date; 
[list addObject:[show autorelease]]; 

MISE À JOUR

La question n'a pas été dans le code copié ici. Dans ma méthode JKShow init, je ne retenais pas la date de retour de la méthode pratique NSDate. Merci pour votre aide tout le monde.

Répondre

0

Je l'ai trouvé, merci pour votre aide, mais le problème était en dehors du code que j'ai posté ici. Je ne retenais pas le NSDate que j'avais créé dans ma méthode init. Malheureusement, le crash ne s'est pas produit avant que j'aie créé les deux nouveaux objets NSDate, alors j'abusais totalement le mauvais arbre.

+0

Probablement une bonne idée de publier votre mise à jour en tant que modification de la question d'origine. Je suis content que vous l'ayez trouvé - chasser ces choses est toujours une douleur. – philsquared

2

La date renvoyée par dateFromComponents doit se trouver dans le pool autorelease. Vous devez donc avoir la propriété showDate "retain". En fait, il devrait être de toute façon (sauf si vous voulez spécifiquement "copier"). À partir du code que vous avez indiqué, il semblerait que vous donniez entièrement la propriété de votre objet d'affichage à la liste (lorsque vous définissez la libération automatique sur eux lorsque vous les ajoutez). Voulez-vous dire que les objets date sont désaffectés avant que les objets show ne sortent de la liste (ou que la liste soit désallouée)?

De même, utilisez-vous des propriétés synthétisées ou les écrivez-vous à la main? Si c'est le cas, à quoi ressemble votre méthode de propriété setShowDate?

Vous pouvez également essayer de consigner le retainCount de l'objet de date à différents endroits (bien que je trouve toujours que autorelease complique vraiment cela).

2

Si showDate est une propriété retain qui devrait être suffisante, compte tenu du code que vous avez posté. Quelque chose d'autre (probablement dans la mise en œuvre de JKShow) peut ne pas être correct.

Si vous voulez comprendre ce qui se passe, vous pouvez utiliser Instruments pour voir la durée de vie des objets. Vous devez l'exécuter avec l'ensemble d'outils d'allocation pour mémoriser les retenues et les versions. Par défaut, il est configuré de cette façon si vous exécutez l'outil de performance des fuites. Lorsque vous exécutez des Instruments comme ça, ils enregistrent toutes les durées de vie de l'objet, et le backtrace pour toutes les retenues et éditions émises à leur encontre. Si vous regardez à travers les objets, trouvez l'une de vos dates, et regardez toutes les retenues et les versions, vous devriez être capable de déterminer où se passe la fausse libération.

+0

Je suis en train de regarder ça maintenant, mais tant que je vous ai ici, comment relier les instruments de votre projet? Dans le passé, j'ai redémarré xcode, mais il semble qu'il y ait forcément une meilleure solution. – kubi

+0

Lorsque vous sélectionnez "Go", il fait tout ce que vous avez fait (Run, Debug, Leaks, etc). Sélectionnez simplement Exécuter de manière explicite et la prochaine fois que vous frapperez Go, il fonctionnera sans les Instruments. –

0

Le code que vous avez montré n'a aucun problème de libération prématurée. En fait, il va fuir le tableau et tout ce qu'il contient, car il ne libère pas le tableau.

Êtes-vous en train d'utiliser le garbage collector?

list est une variable d'instance ou une variable statique, ou s'agit-il d'une variable locale?

+0

L'objet liste est utilisé plus tard et je n'ai aucun problème avec cela. Pas de ramassage des ordures. La liste est une variable locale. – kubi