2009-10-03 8 views
3

Dans Xcode, je lance le programme que j'ai écrit avec l'instrument de fuiteSuis-je vraiment une fuite de mémoire?

Il indique que des fuites ont été découvertes et que le nombre total d'octets perdus augmente.

Je regarde les objets qui fuient et aucun d'eux ne semble provenir de mon programme.

Par exemple, QuartzCore OpenGLES libLLVMContainer.dyl libCoreVMClient.dylib libGFXShared.dylib

Est-ce ma faute que le programme est une fuite mémoire ou est-ce code juste mal écrit par Apple et devrait être prévu?

+0

J'ai couru construire et analyser et trouvé zéro problème. Puis j'ai fait un nouveau projet avec le template opengl donc il n'y avait que le code apple généré. Effectivement, les mêmes fuites de mémoire exactes sont apparues. Donc, à ce stade, je suppose que les fuites ne sont pas de ma faute. – Mel

+0

Une note finale. Je n'ai pas entièrement compris comment l'outil de fuite a fonctionné. Le programme perd au démarrage un très petit nombre dans les octets. Puis n'a plus de fuite. Si vous continuez la mémoire de fuite alors la barre de fuite de mémoire commence à grimper verticalement. – Mel

+2

Une poignée d'octets fuite au démarrage ne devrait pas vraiment être préoccupante. Focus sur les fuites liées à faire quelque chose dans votre application. Si votre application fuit à chaque fois que vous touchez l'écran, dites que c'est un problème sérieux. – bbum

Répondre

10

Il y a toujours une fuite ou deux dans les cadres d'Apple si vous regardez vraiment pour eux (qui fait partie de mon travail de jour). Mais généralement rien de grave, ni les fuites qui se produisent dans le code relativement commun/standard.

La première étape consiste à utiliser Construire et analyser pour effectuer une vérification de base de votre code. Il va attraper de nombreuses fuites potentielles, mais pas toutes.

Ensuite, utilisez Instruments. Lorsque vous trouvez une fuite dans une bibliothèque Apple, regardez la trace de la pile de l'allocation. Plus précisément, recherchez l'image la plus basse qui se trouve dans votre code. C'est typiquement là où votre fuite sera.

Pensez-y de cette façon; Votre code appelle dans un environnement Apple qui peut appeler d'autres bibliothèques et frameworks Apple. Lorsque le code Apple revient, il vous remet un morceau de mémoire. Si vous ne gérez pas correctement cette mémoire, une fuite peut être créée.

+3

J'ai aussi lu que les fuites qui apparaissent dans le simulateur sont différentes de ce qui peut apparaître sur l'appareil. Je vais donc passer aux tests de périphériques. – Mel

+0

Yup - les différences ne sont pas énormes, mais il existe des différences. Commencez par une analyse centrée sur le simulateur, puis passez à l'appareil ciblé pendant que vous polissez pour la libération. – bbum

3

Un programme typique va effectuer des appels dans des bibliothèques tierces, par ex. Cadres GUI. Si le programme ne libère pas les ressources qu'il alloue, elles ne seront pas détruites. Alors oui, c'est probablement ta faute!

1

Je suppose que Apple n'a pas de fuites de mémoire. Ils ont aussi des instruments. Ils ont certainement fait des tests. La seule fois où j'ai entendu parler de fuites est dans le webview UIKit. Je ferais quelques lectures sur les instruments et je m'assurerais que vous lisez bien la pile.

0

build utiliser et analyser les trouver