Question

J'ai de nombreux problèmes avec la désallocation prématurée des objets NSDate. Je soupçonne que les problèmes peuvent être liés à la façon dont je traite les objets renvoyés par les méthodes pratiques de NSDate. Je pense que ma déclaration de propriété showDate dans la classe JKShow devrait être "conserve", mais la modifier pour l'assigner ou la copier semble n'avoir aucun effet sur le problème.

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]];

UPDATE

Le problème ne figurait pas dans le code copié ici. Dans ma méthode JKShow init , je ne conservais pas la date renvoyée par la méthode pratique NSDate . Merci à tous pour votre aide.

Était-ce utile?

La solution 4

Je l'ai compris, merci pour toute votre aide, mais le problème était en dehors du code que j'ai posté ici. Je ne conservais pas le NSDate que j'avais créé dans ma méthode init. Malheureusement, le crash ne s'est pas produit avant la création des deux nouveaux objets NSDate . J'abîmais donc totalement le mauvais arbre.

Autres conseils

La date renvoyée par dateFromComponents doit figurer dans le pool de libération automatique. Vous avez donc raison de penser que votre propriété showDate doit être "retenue". En fait, cela devrait l'être quand même (à moins que vous ne vouliez spécifiquement "copier").

D'après le code que vous avez montré, il semble que vous donniez la propriété de votre objet show entièrement à la liste (car vous définissez la libération automatique sur eux lorsque vous les ajoutez). Voulez-vous dire que les objets de date sont désalloués avant que les objets d'affichage ne sortent de la liste (ou la liste est désallouée)?

De plus, utilisez-vous des propriétés synthétisées ou les écrivez-vous à la main? Si tel est le cas, quelle est votre méthode de propriété setShowDate?

Vous pouvez également essayer de consigner le retentionCount de l'objet de date à différents endroits (bien que je trouve toujours que la libération automatique complique vraiment cela).

Si showDate est une propriété de retenue qui devrait être suffisante, en fonction du code que vous avez publié. Quelque chose d'autre (probablement dans l'implémentation de JKShow) peut ne pas être correct.

Si vous voulez savoir ce qui se passe, vous pouvez utiliser Instruments pour voir examiner la durée de vie des objets. Vous devez l'exécuter avec l'outil d'allocation défini pour mémoriser les retenues et les éditions. Par défaut, il est configuré de cette manière si vous exécutez l'outil de performances des fuites.

Lorsque vous exécutez de tels instruments, il enregistre toutes les durées de vie des objets, ainsi que la trace de chaque trace conservée et validée. Si vous regardez à travers les objets, trouvez l’une de vos dates et toutes les retenues et les libérations, vous devriez être en mesure de déterminer où se trouve la fausse libération.

Le code que vous avez présenté ne présente pas de problème de publication prématurée. En fait, le tableau et tout le contenu de celui-ci fuiront, car il ne libère pas le tableau.

Êtes-vous en cours d'exécution avec le ramasse-miettes activé?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top