2009-05-24 20 views
2

Ich habe eine iPhone-Anwendung entwickelt, die eine Tabbed-Ansicht öffnet, wobei der erste Tab ein uinavigationcontroller ist. Innerhalb dieses Controllers befindet sich ein uiviewcontroller, der eine uitableview enthält. In der Tabellenansicht sind 2 Einträge aufgeführt. Wenn ich das eine oder das andere Element auswähle, zeigt es noch einen anderen iiview-Controller mit dynamisch generierten uiviews an.iPhone Speicherverbrauch

Wenn ich die "Zurück" -Schaltfläche oben in der Navigationstaste drücke, um zum vorherigen uiviewcontroller zurückzukehren (der die Tabellenansicht enthält), und dann eins der beiden Elemente in der uitableview erneut auswähle, wird es verbraucht fast 2M Speicher nach Instrumenten. Dies geschieht jedes Mal, bis es etwa 24 Millionen erreicht, und meine Anwendung abstürzt.

Ich registriere keinerlei Lecks.

Gibt es etwas, was ich tun muss, wenn die "Zurück" -Taste gedrückt wird, um den Speicher freizugeben, der dem uiviewcontroller zugewiesen ist.

+0

Verwenden Sie SQLite? Erhält Ihre Anwendung Speicherwarnungen? Läuft das auf dem Gerät oder durch den Simulator? – rein

+0

Nein, ich verwende keine SQLite. Ich verwende eine Eigenschaftslistendatei, um Daten zu erhalten. Ich bin mir nicht sicher über Speicherwarnungen. Ich muss der didReceiveMemoryWarning-Methode Code hinzufügen, um zu sehen, welche Arten von Warnungen ich erhalte. Ich verwende meine App sowohl über den Simulator als auch über mein iPhone-Gerät. Beide registrieren eine große Speichernutzung –

Antwort

1

Der Navigationscontroller behält alle View-Controller auf seinem Stack bei. Wenn Sie also sicherstellen, dass solche View-Controller automatisch freigegeben sind oder keinen Anspruch auf sie haben (z. B. alloc, push, release), werden sie automatisch freigegeben wenn gepoppt.

Wenn Sie dies tun und immer noch Speicher verlieren, behalten Sie vielleicht Ihre benutzerdefinierten Ansichten von ihren View-Controllern zu stark aus?

Es ist schwer zu sagen, ohne Code zu sehen, aber eine Sache, die nützlich sein könnte, ist -DidReceiveMemoryWarning auf alle Ihre UIViewControllers und Protokollierung von ihnen - dann, wenn Sie eine Speicherwarnung von einem View-Controller, die Sie denken, hätte sein sollen freigegeben, haben Sie einen Ausgangspunkt für weitere Untersuchungen.

Haben Sie auch den Clang Static Analyzer ausprobiert? Das Leaks-Tool ist nützlich, bietet aber viele falsche Negative. Das CSA ist auch kein Allheilmittel, aber es fängt einige Dinge auf, die Lecks vermissen.

2

Ich bin mir nicht sicher, wie weit Sie in der iPhone-Entwicklung sind oder wie viel Sie über die Speicherverwaltung wissen, aber es könnte ein Problem mit der Zählung von Referenzen sein. Denken Sie daran: Wenn Sie Alloc oder Retain aufrufen, müssen Sie die Freigabe aufrufen und die Freigabe für etwas, das Sie nicht zugewiesen oder behalten haben, nicht aufrufen.