2011-08-09 5 views
1

J'ai hérité du code pour une application iPhone en utilisant les données de base écrites par une autre équipe. En regardant les relations entre les objets et comment les objets sont créés/utilisés dans le code, j'ai réalisé qu'il y avait une fuite de mémoire dans le stockage permanent. Assez sûr quand je supprime tous les objets de niveau supérieur des données de base là où les objets laissés pour compte. Quoi de plus il y avait une opération où les valeurs/relations d'un objet étaient copiées à un autre et cela laissait des objets orphelins dans les données de base.Fuite de mémoire dans le stockage permanent

Depuis, j'ai corrigé les problèmes et il n'y a plus de nouveaux objets orphelins stockés dans les données de base. Le problème est maintenant comment puis-je retiré ces objets orphelins du stockage permanent des utilisateurs existants qui ont utilisé l'application qui fuit pour qui sait combien de temps?

Ma pensée initiale était de copier les objets de niveau supérieur à un autre ManagedObjectContext. Puis supprimez tous les objets hors du contexte d'origine. Enfin, copiez les objets de niveau supérieur dans le contexte d'origine. Est-ce que quelqu'un voit des problèmes avec ceci ou a une meilleure idée?

Répondre

1

Les objets orphelins doivent avoir une relation vide afin que vous puissiez simplement récupérer sur cette relation vide et supprimer les objets retournés.

Vous souhaitez probablement mettre à jour le modèle de données pour empêcher les objets orphelins. Les orphelins sont généralement le signe d'un modèle mal conçu. Assurez-vous que toutes les relations sont réciproques et, le cas échéant, établissez une relation requise. Vous pouvez également ajouter une validation pour empêcher les orphelins.

+0

vous avez raison sur le modèle de données faisant partie du problème. Ils avaient des relations définies avec Nullify au lieu de Cascade. Je suis curieux de savoir ce que vous voulez dire par validation. Valider comment? – iHorse

+0

Je suis d'accord avec aller chercher pour une relation vide. Pour la validation, il signifie que vous pouvez remplacer l'entrée validateFor <...>, mettre à jour, supprimer une classe d'objets gérés, et mettre une certaine logique là-dedans. Si cela échoue, l'objet ne sera pas sauvegardé, avec la possibilité de construire et d'élever votre propre message d'erreur comme 'l'objet ne peut pas être sauvegardé car orphelin de ...' – Leonardo