Frage

Ich baue einen Parsing-Algorithmus NSXMLParser. Im mit Zweifel darüber, was die beste Strategie ist auf einem Minimum meine Speicherauslastung zu halten.

Ich habe ein valueObject (zum Beispiel „Person“) hat dieses Objekt ≈ 30 NSString Eigenschaften, während der XML-Parsing ich ständig alloc und läßt ein temporäres Person-Objekt als die Knoten durchlaufen werden. Ich habe dies und es ist nur eine dieser Person Objekte jederzeit instanziiert. Wenn ein Knoten durchlaufen wird und eine Person ist „build“ I die Person zu einem NSMutableArray geben und diese Person freigeben. Scheint es kein Problem. (Ich muss das Array für eine Tableview). Als ich um 50+ Person Objekte im Array erreichen meine app gerade beendet wird, ist didReceiveMemoryWarning nicht aufgerufen, keine anderen Warnungen, keine parseErrorOccurred, nichts?

Wenn ich die Anzahl der Personen, die auf XML schränkt die App nur in Ordnung, ich habe nicht vermocht, keine Speicherlecks mit Instrumenten zu finden. Ich denke, dass ich einfach nicht 50+ Person-Objekte in einem Array halten kann ... scheint ein bisschen hart, aber ich habe nicht viele Speicher Erfahrungen mit dem iPhone bekommt, so ist dies nur eine Vermutung.

Die XML ist die Suchergebnisse aus dem der Benutzer wahrscheinlich nur wenige brauchen, so sie zu meinem Kernmodell persistierenden sie für die Anzeige um zu halten scheint ein bisschen verrückt.

Was wäre eine gute Strategie sein zu halten diese Person um Objekte? oder bin ich seit dem iPhone einen großen Speicherleck fehlen sollte viel mehr als das zu handhaben kann?

Hope einige erfahrene Entwickler mich in die richtige Richtung zeigen kann:)

Danke!

War es hilfreich?

Lösung

Wie lange sind die Saiten? Im Allgemeinen auf dem iPhone 3G und älteren Modellen, sollten Sie Ihre App ein Minimum von etwa 20 MB Speicher zur Verfügung haben (viel mehr auf dem 3Gs). Dies ist keine absolute Regel, natürlich, aber eine ordentliche Faustregel. Um diese viel Speicher mit 50 Objekten besetzen würde bedeuten, ~ 400-500 KB pro Person Objekt. Ist das im Baseballstadion? Wenn ja, müssen Sie wahrscheinlich eine Speicher-Management-Strategie, die nicht alle Objekte im Speicher zur gleichen Zeit nicht halten. Core Data können Sie wahrscheinlich helfen viel in diesem Fall.

Andere Tipps

Trotz NSXMLParser ist ein SAX-basierte Parser es nicht Unterstützung eines Eingangsstrom-Parsing, was bedeutet, dass die gesamte XML-String Sie Parsen im Speicher gehalten wird. Dies allein ist ein großes Problem, aber wie Sie das Problem bekommt analysieren schlimmer als Sie beginnen, die String-Daten aus dem XML in Ihren Person Objekten zu duplizieren.

Wenn Sie die Saiten wirklich groß sind, haben Sie das zweite Problem, zu viele geparsten Person Objekte im Speicher zu einer Zeit.

Das erste Problem kann durch die Verwendung AQXMLParser von Jim Dovey die gelöst werden AQToolkit Bibliothek, die eine NSXMLParser bietet -ähnliche API aber mit Unterstützung für das Streaming der Daten von der Festplatte.

Das zweite Problem gelöst werden kann, eine Disk-basierten Persistenz-Technologie, wie Core Data, SQLite Persistent Objects, oder auch nur die Person speichert Objekte auf der Festplatte selbst.

Wenn Sie keinen Speicher erhalten haben es Warnung ist wahrscheinlich nicht der Grund, warum die App verlassen wird. In Xcode an den Veranstalter gehen, und das Gerät auswählen, dann klicken Sie auf die Registerkarte Konsole. Wenn sie app Abschaltung für Speicher Gründen war es wird eine Systemmeldung im Konsolenprotokoll sein sagen, es ist die App aufgrund Speicherdruck zu töten.

Die Antwort ist den eingehenden Strom zerhacken, schrieb ich einen Beitrag über sie vor einiger Zeit: https://lukassen.wordpress.com/ 2010/01/15 / feeding-NSXMLParser-a-stream-of-xml /

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top