Question

Je construis un algorithme d'analyse syntaxique à l'aide NSXMLParser. Im ayant des doutes quant à ce qui est la meilleure stratégie pour garder mon utilisation de la mémoire sur un minimum.

J'ai un ValueObject (par exemple « personne ») cet objet a ≈ 30 propriétés de NSString, alors que l'analyse du xml que je cesse alloc et libérer un objet temporaire de personne que les noeuds sont traversés. J'ai vérifié et il n'y a qu'un seul de ces objets personne instanciés à tout moment. Lorsqu'un noeud est traversé et une personne est « construire » Je passe la personne à un NSMutableArray et libérer cette personne. Semble il n'y a pas de problème. (Je vais avoir besoin du tableau pour un tableView). Quand j'atteindre environ 50 objets personne dans le tableau mon application se ferme juste, didReceiveMemoryWarning ne soit pas appelé, aucun autre avertissement, pas parseErrorOccurred, rien?

Si je limite le nombre de personnes en XML l'application ne fonctionne tout simplement très bien, je n'ai pas été en mesure de trouver des fuites de mémoire avec des instruments. Je pense que je ne peux tout simplement pas tenir 50+ objets personne dans un tableau ... semble un peu dur, mais je n'ai pas beaucoup d'expérience de la mémoire avec l'iPhone, c'est donc juste une supposition.

Le xml est les résultats de recherche dont l'utilisateur a besoin probablement que quelques-unes, afin de les persister à mon modèle de base pour les conserver pour l'affichage semble un peu fou.

Quelle serait une bonne stratégie pour garder ces objets personne autour? ou suis-je manque une énorme fuite de mémoire depuis l'iPhone devrait être capable de gérer beaucoup plus que cela?

espère que certains développeurs expérimentés peuvent me diriger dans la bonne direction:)

Merci!

Était-ce utile?

La solution

Combien de temps sont les chaînes? En général, sur les modèles iPhone 3G et plus, votre application devrait avoir un minimum d'environ 20 Mo de mémoire disponible (beaucoup plus sur le 3Gs). Ce pas de règle absolue, bien sûr, mais une règle générale décente. Pour occuper cette quantité de mémoire avec 50 objets signifierait ~ 400-500 Ko par personne objet. Est-ce dans le stade de baseball? Si oui, vous aurez probablement besoin d'une stratégie de gestion de la mémoire qui ne garde pas tous les objets en mémoire en même temps. Les données de base peut probablement vous aider beaucoup dans ce cas.

Autres conseils

En dépit NSXMLParser étant un analyseur syntaxique basé sur SAX-it ne pas Prise en charge l'analyse d'un flux d'entrée, ce qui signifie que la chaîne XML entière vous analyse syntaxique est gardée en mémoire. Ce lui-même est un gros problème, mais comme vous le problème s'analysez pire que vous commencez à dupliquer les données de chaîne à partir du XML dans vos objets Person.

Si vos chaînes sont vraiment grand, vous avez le deuxième problème d'avoir trop d'objets de Person analysable en mémoire à un moment donné.

Le premier problème peut être résolu en utilisant AQXMLParser de AQToolkit Jim Dovey, qui fournit une NSXMLParser API -comme mais avec le soutien pour la diffusion des données à partir du disque.

Le deuxième problème peut être résolu en utilisant une technologie de persistance sur disque, comme base de données, SQLite objets persistants, ou même simplement stocker les objets personne sur le disque vous-même.

Si vous ne recevez pas une mémoire d'avertissement, il est probablement pas la raison pour laquelle votre application Cesser. Dans Xcode aller à l'organisateur, et sélectionnez l'appareil, puis cliquez sur l'onglet de la console. S'ils étaient app arrêt pour des raisons de mémoire, il y aura un message système dans le journal de la console en disant qu'il est en train de tuer l'application due à la pression de la mémoire.

La réponse est de couper le flux entrant, je l'ai écrit il y a un post sur un peu de temps: https://lukassen.wordpress.com/ 2010/01/15 / alimentation-nsxmlparser-a-flux-de-xml /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top