Je crée une application qui comporte plusieurs animations. Il y a 50 pages et sur chaque page il y a une animation différente et chaque animation utilise de nombreuses images.
J'utilise Lorsque je balaye continuellement l'application se bloque avec ce message: - p> UipresentModelviewController code> pour présenter les vues et
modifie des images à l'aide de
nstimer code>. p>
Program received signal: â0â.
Data Formatters temporarily unavailable, will re-try after a 'continue'.
(Unknown error loading shared library "/Developer/usr/lib/libXcodeDebuggerSupport.dylib")
8 Réponses :
Vérifiez simplement dans votre code que vous faites une erreur en ajoutant une nouvelle vue à chaque fois, mais j'ai oublié de le libérer ... P>
Merci de votre réponse, mais nous avons utilisé Iboutlet dans XIB et change d'images à ce sujet en conséquence .... s'il vous plaît suggérer quelque chose sur elle plus .. Merci ..
Vous devez regarder (et peut-être poster) la trace de la pile lorsque vous vous écrasez. Et le code qui change l'image. Cela ressemble à la mémoire de la mémoire (pas une vraie fuite dans laquelle quelqu'un fait toujours référence à la mémoire). L'élément de menu Analyser peut attraper quelque chose (et vous devez certainement l'exécuter), mais vous devrez peut-être exécuter l'instrument d'allocation et regarder des chèques de tas. Voir http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-utilisant-heapshot-analysis-a -find-indésirable-mémoire-croissance / pour plus. p>
Cela ressemble à un débordement de pile pour moi. Dans la section "Autres drapeaux C" des paramètres de langue C / C ++ du projet, ajoutez un drapeau "-Fstack-check" et voyez si cela provoque une récursion indésirable. P>
Signal 0 est généralement dû à la mémoire faible comme l'application utilisant trop de mémoire. Vérifiez si la méthode d'avertissement de la mémoire est appelée ou non. p>
La fonction de formateur de données n'a pas pu être chargée d'être due à une mémoire suffisante pour le charger .. p>
Cette réponse est correcte, si vous obtenez un signal 0, vous avez utilisé toute la mémoire de l'application disponible. Vous devez revenir en arrière et réécrire votre code afin qu'il ne contienne pas toutes les images décompressées en mémoire en même temps. C'est votre cause la plus probable de manquer de mémoire, car les images décompressées sont énormes!
50 vues comme si vous décrivez des sons comme un gros porc de mémoire. Je soupçonne donc que la gestion de la mémoire décharge des vues. Ensuite, lorsque votre programme a besoin des points de vue, ils ne sont pas là et votre programme se bloque. Le message d'erreur ne correspond pas tout à fait ceci, mais cela ne vous dit peut-être pas exactement quel est le problème. P>
Considérez le scénario possible suivant et voyez s'il correspond à la manière dont vous avez codé ce programme. P>
Pour que le système d'exploitation gère la mémoire, il peut décharger des vues et les recharger au besoin. Lorsque cela est fait, les méthodes viewDInLoad, LoadView et ViewDidLoad sont appelées. p>
ViewDidunload: p>
Cette méthode est appelée contrepartie à la méthode ViewDidLoad. Il est appelé pendant les conditions de mémoire faible lorsque le contrôleur d'affichage doit libérer sa vue et tous les objets associés à cette vue pour libérer la mémoire. Étant donné que les contrôleurs d'affichage stockent souvent des références à des vues et d'autres objets liés à la vue, vous devez utiliser cette méthode pour renoncer à la propriété de ces objets afin que la mémoire puisse être récupérée. Vous devez le faire uniquement pour les objets que vous pouvez facilement recréer ultérieurement, que ce soit dans votre méthode ViewDidLoad ou à partir d'autres parties de votre application. Vous ne devez pas utiliser cette méthode pour libérer des données utilisateur ou d'autres informations qui ne peuvent pas être facilement recréées. P> blockQuote>
LOADVIEW: P>
Le contrôleur d'affichage appelle cette méthode lorsque la propriété View est demandée mais est actuellement nulle. Si vous créez vos vues manuellement, vous devez remplacer cette méthode et l'utiliser pour créer vos points de vue. Si vous utilisez l'interface Builder pour créer vos vues et initialiser le contrôleur d'affichage, vous initialisez la vue à l'aide de l'initwithnibname: Bundle: méthode, définissez directement les propriétés NIBNAME et NIBBUNDLE, ou créez votre contrôleur de vues et affichage dans l'interface Builder- Ensuite, vous ne devez pas remplacer cette méthode. P> blockQuote>
Vérifiez la référence de la classe UIView - p>
ViewDidLoad: p>
Cette méthode est appelée après que le contrôleur d'affichage a chargé ses vues associées dans la mémoire. Cette méthode est appelée si les vues ont été stockées dans un fichier NIB ou créé par programme dans la méthode LoadView. Cette méthode est la plus couramment utilisée pour effectuer des étapes d'initialisation supplémentaires sur des vues chargées à partir de fichiers NIB. P> blockQuote>
Vous pouvez avoir initialement initialisé ces points de vue dans vos méthodes init plutôt que dans vos méthodes LoadView. Si vous l'avez fait, alors lorsque le système d'exploitation décharge une vue (vous verrez ViewDiDunload est appelé) La mémoire associée à la vue et à toutes les sous-étapes (toutes les images et animations) seront déchargées. Cela permet de sauve la mémoire, mais lorsque vous avez besoin d'une de ces vues non chargées pour réapparaître, LockView sera appelé en premier si la vue avait déjà été déchargée. Si votre configuration de visualisation est effectuée dans les méthodes init plutôt que dans LoadView, la vue ne sera plus configurée. Mais si la configuration de la vue est effectuée dans la méthode LoadView, elle peut être récupérée après la décharge de la gestion de la mémoire. p>
ViewDidunload est obsolète dans iOS 6.0. Les vues ne sont plus purgées dans des conditions de mémoire faible et cette méthode n'est donc jamais appelée.
Il y a un moyen facile de trouver des fuites difficiles à trouver via des instruments de fuite et ainsi de suite - analyseur de zombies. Il affiche chaque mémoire non liée dans votre programme et vous pouvez facilement détecter des fuites et optimiser le code en minutes. P>
Si vous utilisez beaucoup d'images pour une seule animation, vous le faites mal. Vous devez en avoir un, ou plusieurs très grandes images, puis montrer une partie de cette image. De cette façon, vous pouvez charger très peu d'images, mais avoir le même affect d'avoir de nombreuses images. P>
Regardez dans Cocos2D ou dans d'autres cadres populaires pour faire des jeux, car ils seront beaucoup plus efficaces pour les animations que l'UIKIT. P>
Découvrez la raison du crash de mémoire à l'aide de l'outil Instrument, puis refactorisez le code avec les meilleures pratiques avec le modèle de conception recommandé. Il n'y a pas de solution unique pour cela. Merci. P>
Avez-vous essayé d'exécuter "analyseur" pour voir s'il trouve des fuites potentielles?
@Hansgruber: Oui, nous avons essayé de courir avec des fuites de mémoire mais nous n'avons aucune fuite trouvée. Toute autre solution sur même s'il vous plaît .. merci ..
L'analyseur et les fuites sont des outils différents. Il existe un analyseur Static Clang que vous pouvez utiliser pour trouver non seulement des fuites de mémoire, mais également d'autres taches de problème dans le code. C'est une bonne idée de le courir périodiquement. Notez que l'analyseur Static Clang ne fonctionne pas sous instruments et n'est pas un outil de profilage. Vous le trouverez dans le menu Produits. "Produits> Analyser". Les fuites d'autre part sont un outil de profilage permettant de surveiller les objets pour voir s'ils ne sont pas libérés après toutes les références à l'objet sont supprimées.
Postez le code où vous mettez à jour les images. Vous pouvez avoir une fuite qui sort du contrôle. Aussi, je suppose que vous avez lu formateurs de données temporairement indisponibles, Réessayez après une «Continuer» . Le problème est dû à des fuites de mémoire.
Repas de ses fuites de mémoire probablement de quelque sorte. Donnez-vous votre minuterie sur les points de vue correctement? N'oubliez pas qu'ils conservent leur objectif, donc si vous avez une minuterie exceptionnelle, non seulement cela restera et éventuellement fuir, mais la cible sa volonté de retenue. Ce qui signifie que chacun de ces vues que vous chargez ne disparaîtra jamais.
Notez que vous devez utiliser une méthode de chargement d'images qui gérera des images chargées pour vous et permettront à des "statiles" d'être "déchargés".
[UIIMAGE Imagenamed: ...] code> est une option.