2010-07-23 2 views
0

je l'ai réduit un problème de fuite de mémoire jusqu'à ce bloc de code spécifique:fuite de base de données étrangement sur l'appareil, mais pas sur simulateur

NSFetchRequest *req = [NSFetchRequest new]; 
NSEntityDescription *descr = [NSEntityDescription entityForName:@"Capture" inManagedObjectContext:dataContext]; 
[req setEntity:descr]; 
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"created_at" ascending:NO]; 
[req setSortDescriptors:[NSArray arrayWithObject:sort]]; 
[sort release]; 
NSError *error; 
NSArray *ret = [dataContext executeFetchRequest:req error:&error]; 
[req release]; 

Ce bloc existe soit la méthode init ou viewDidLoad pour un contrôleur vue d'une couche ou deux vers le bas dans le contrôleur de navigation.

Là où je suis confus et ne sais pas quoi faire est que je reçois des fuites de mémoire avec ce code lié à CoreGraphics, Foundation, et même JavaScript Core, mais je ne suis pas sûr comment corriger le problème (pas sûr de ce le problème est). Cela se produit uniquement lors de l'exécution d'Instruments sur l'installation du périphérique, et non dans le simulateur.

[Cela ne me laisse pas poster la photo d'instruments, donc voici la photo: http://twitpic.com/27vwm1]

A titre d'arrière-plan, mon modèle de données de base utilisées pour avoir une propriété qui a tenu un UIImage transformé, mais je J'ai depuis converti cela en NSNumber et reconstruit les classes d'objets pour mon projet. Est-ce que cela pourrait avoir quelque chose à voir avec cela et y a-t-il une autre étape que je dois prendre en changeant autour de mon modèle?

Thx

** Mise à jour: ** URL changé pour l'image

+0

Votre lien affiche une page vierge sans source paire. – TechZen

+0

étrange. J'ai changé le lien, essayez-le maintenant. – Jeof

+0

Bon, maintenant ça marche. – TechZen

Répondre

1

Si vous appuyez sur le bouton source dans le panneau inférieur des instruments et faites glisser le fichier source en lui, il vous montrera la ligne votre code où il pense que la fuite est. Si l'application est en cours d'exécution, vous pouvez copier l'adresse des objets présentés au débogueur et comme celui-ci:

po 0x1a831 

... et il imprimer une description de l'objet à cette adresse. Il est probable que votre fuite résulte d'un effet secondaire lié à la récupération de vos objets gérés. Les transformateurs de valeur sont une source commune de telles fuites car ils créent des objets chaque fois qu'ils sont utilisés. Je regarderais les sous-classes d'objets gérés eux-mêmes pour la source de la fuite.

+0

Je suis un peu nouveau pour faire face à des problèmes de mémoire, alors je m'excuse pour toute ignorance ici. Mais où vais-je trouver le bouton Source dans le panneau inférieur d'Instruments? Dans Détail détaillé, j'ai trouvé une option Emplacement source, mais elle ne montre aucun de mes codes - c'est comme si toutes les fuites étaient dans les frameworks par défaut et autres. En outre, je n'utilise plus de transformations de valeur dans mes objets gérés/données de base, et les fichiers objets sont assez simples et par défaut. Ai-je raté une étape dans la conversion loin des transformateurs - est-ce quelque chose caché ou quelque chose de bizarre comme ça? – Jeof

+0

Heck, je ne suis pas sûr. Je viens de vérifier et la nouvelle version fournie avec Xcode 3.2.3 a une interface différente des versions précédentes et une autre du guide de l'utilisateur d'Instruments. C'était en bas de la vue de détail mais ces boutons ne sont plus là. – TechZen

+0

Voici comment ça marche http://stackoverflow.com/questions/1634067/iphone-analyzing-leaks-with-instruments/1639237#1639237 – TechZen

0

J'ai un problème similaire dans mon application, et un ami aussi dans une autre application. Nous avons vérifié et revérifié notre code, et il n'y a rien de mal de notre côté (nous faisons les mêmes choses de base que dans l'exemple de code d'Apple).

Il semble qu'il y ait des effets secondaires désagréables lors de l'utilisation des données de base sur le périphérique, ce qui n'arrive pas sur le simulateur.

J'ai passé beaucoup de temps sur ce problème, et je suis au point où le problème est vraiment sur le cadre de la pomme et non sur mon code. Je pense que ce serait une bonne idée de soumettre un rapport de bogue pour ce problème.

Remarque: Je rencontre ce problème sans utiliser d'objets personnalisés ou transformables, mais uniquement des attributs de chaîne dans mes objets gérés.

0

D'accord, même problème ici. Même si vous utilisez simplement le code généré par l'assistant avec une vue partagée et des données de base, il fuit! Il m'a fallu du temps pour le savoir. J'avais écris une tonne de code sur une application et quand je suis prêt à commencer les tests de fuite, je n'ai pas pu trouver la source de la fuite car les instruments ne montraient rien dans mon code. J'avais exactement les mêmes symptômes que vous. Donc, après quelques jours de commentaire sur mon code, j'ai décidé de lancer le projet de template pour splitview, de cocher les données de base et de ne pas ajouter de code moi-même. Devinez quoi? même foutue fuite. Cela se produit uniquement au démarrage de l'application et uniquement si vous avez utilisé l'application pour ajouter des éléments. Im surpris cela n'a pas été corrigé par Apple ou au moins une solution de contournement mentionnée. Suis-je le seul à utiliser Core Data avec un Splitview?