Comment déboguer iOS plantage dû à la pression de la mémoire
Je suis en utilisant l'ARC et l'application se bloque en disant reçu un avertissement de mémoire.
Je me suis mise à l'essai de l'application directement sur l'appareil (iPhone 4 avec iOS 7.0.2) et de la compilation avec XCode 5 utilisation du kit SDK d'iOS 6.
J'ai utilisé la pomme instruments et je vais avoir ont autour de 20 MO LiveBytes alloué.
Après 4 à 5 min de mon appli a 30 mo de mémoire.
Après compilation et test de l'application sur le périphérique, je vois que crash après quelques minutes, juste après le mémoire de message d'avertissement. Pourquoi ne se passent pas de plantage lors de l'utilisation d'instruments?
Cependant, je suis en train de résoudre ce problème pour un mois et ne peut pas obtenir la chose rite, et j'ai vraiment besoin d'aide.
Il ressemble comme je n'ai pas de fuites, mais je ne trouve pas où est le mal.
Merci d'avance pour tous les conseils.
J'ai essentiellement le même problème, peut-poster une autre question bientôt, si je ne peux pas trouver la réponse ailleurs.
J'ai résolu mon problème, vérifier ma réponse.
OriginalL'auteur andreapavan | 2013-10-08
Vous devez vous connecter pour publier un commentaire.
J'ai résolu le problème. Dans mon cas, la pression de mémoire, c'était en raison de la constante de l'utilisation de la mémoire par une exécution de la boucle. La boucle est exécutée à chaque seconde et travaille sur des données qui doivent être analysées et présentées dans le point de vue. Une autre chose, le projet initialement n'a pas été à l'aide de l'ARC. Après un projet de conversion à l'ARC s'est produit le problème.
Avant la conversion du projet à l'ARC, à la fin de la boucle, j'ai eu un appel direct pour la libération des ressources. Avec l'ARC bien sûr, cela est fait automatiquement, et le problème est juste que. Ainsi, pour la classe qui gère la boucle, je suis retourné à la non-ARC version et j'ai utilisé les trucs à faire manuellement pour libérer les ressources que j'ai utilisé.
Autorelease pool de blocs de fournir un mécanisme par lequel vous pouvez renoncer à la propriété d'un objet, mais d'éviter la possibilité qu'il soit libéré immédiatement (comme lorsque vous revenez d'un objet à partir d'une méthode). En règle générale, vous n'avez pas besoin de créer votre propre autorelease pool de blocs, mais il y a certaines situations dans lesquelles vous devez ou il est avantageux de le faire.
À la fin de l'autorelease pool de bloc, les objets qui ont reçu une autorelease message dans le bloc de l'envoi d'un message de libération—un objet reçoit un message de libération pour à chaque fois qu'il a été envoyé un autorelease message dans le bloc.
Vous pouvez placer un @autoreleasepool bloc autour d'une section de code, cependant, vous ne devriez vraiment pas faire ce que je pense que vous faites.
Autorelease est beaucoup moins efficace que de permettre à l'ARC d'ajouter à retenir et libérer les appels pour vous, et c'est potentiellement dangereux. Autorelease place tous vos objets dans un "pool" et puis, lorsque vous êtes hors de portée et/ou à chaque fois qu'il décide de vider la piscine, il "drains" la piscine et les objets conservent compte obtenir décrémenté de un.
La réponse est simple: Laisser les @autorelease bloque complètement, sauf si Apple dit le contraire dans la documentation ou le modèle (par exemple, main.m aura un @autoreleasepool).
Cela signifie que vos objets pourraient éventuellement obtenir libéré avant d'avoir vraiment voulu. @autoreleasepool blocs sont plus utiles pour quand vous avez très serré de la boucle de code qui va instancier et puis défaussez-vous d'une quantité massive d'objets. Par exemple, une boucle qui traite une énorme base de données et alloue de la chaîne des objets et utilise ensuite ces objets string pour remplir les propriétés des instances d'une classe que vous avez créé. Dans ce cas, l'ARC ne peut pas libérer ces objets de manière fiable pendant que vous êtes à l'intérieur de la boucle for et vous devrez peut-être créer un autorelease pool.
Toutefois, l'ARC ne pas faire la bonne chose dans une boucle n'est pas très commun. Il est vraiment plus d'un non-concept d'ARC, où vous utilisez un NSAutoreleasePool et manuelle de vidange.
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html#//apple_ref/doc/uid/20000047-CJBFBEDI
J'espère que j'ai aidé les autres avec le même problème.
@autoreleasepool
s sont encore utiles à l'ARC, et pas seulement en boucles serrées. J'ai vu@autorelease
aider à la mémoire de problèmes de pression dans mon appli lorsque l'on traite avec une grande mémoire I/O à l'extérieur des boucles. Aussi: stackoverflow.com/questions/9086913/...j'ai le même problème. j'ai 5k enregistrer à partir du service web que je suis l'insertion de ce tous les records de la db. Chaque fois que 3k enregistrement inséré que l'application crash. Ma boucle courir 5k temps que je l'ai insérer 5k enregistrement. ainsi en est-il de l'amende à mettre en œuvre autoreleasepool méthode en boucle ?
Le mien était un cas assez particulier parce que je devais obtenir mes mains sur un projet élaboré en plusieurs étapes. Comme l'a dit Shizam,autoreleasepools sont également utiles si vous utilisez un ARC. En règle générale, vous n'avez pas besoin de créer votre propre autorelease pool de blocs, mais il y a certaines situations dans lesquelles vous l'un ou l'autre ou il est avantageux de le faire. J'ai eu un problème entre l'ARC et le bloc autoreleasepool. Dans la vieille mise en œuvre de ce sujet est traité manuellement, et j'ai gardé de cette façon. Je l'ai indiqué dans les paramètres de la classe ne comprend pas l'utilisation de l'ARC et j'ai géré la mémoire manuellement à l'aide d'un bloc de autoreleasepool le cas échéant.
Vérifiez également cette grande réponse @mattjgalloway qui fournit davantage de détails concernant les blocs autoreleaspool à l'aide de l'ARC. stackoverflow.com/a/9087002/1056493
Je vais avoir la même situation que @Codeur. Avez-vous trouvé une solution pour que @Codeur?
OriginalL'auteur andreapavan
OriginalL'auteur Bhushan_pawar