Speicher nur Garbage Collector ?
Tach auch,
als eingefleischter Macianer und iPhone Entwickler versuche ich mich nun seit einigen Tagen in der Windows Phone Entwicklung. Alles was ich bisher hinbekommen wollte ist soweit auch ganz gut geglückt. Nun stelle ich mir allerdings die Frage, ob ich eigene Objekte auch selbst Freigeben kann. In allen Tutorials wurde Speicher wie Wild alloziert und nicht selbstständig freigegeben, was meiner Meinung nach bei Größeren Programmen "Wie meins" zum Problem werden könnte.
Auch würde ich gern Wissen wie die automatische Speicherverwaltung zwischen Pages genau abläuft. Beispiel:
Ich habe mehrere Pages, in denen ich Werte eintragen kann. Klicke ich nun einen HyperlinkButtton öffnet er mir eine neue Page und erstellt mir eine neue Instanz der gelinkten Page dar. Gehe ich nun mittels HyperlinkButton zurück wird mir wieder eine neue Instanz der alten Page erstellt, was via zurück Button auf dem Gerät ja nicht der Fall ist. Wie kann man solch ein Verhalten von vorn herein unterbinden?
Zur Werte Verwaltung: Gibt es keinen besseren Weg, als die Werte der vorherigen Page kurz ins Dictionary des PhoneApplicationService zu kopieren? Ich mein "Theoretisch", kann es die SW doch schon selbst. Als Beispiel wäre hier wieder die Navigation von einer bestehenden zur neuen instanz und wieder zurück über den zurück Button auf dem Gerät.
AW: Speicher nur Garbage Collector ?
Nein, in C#/VB gibt es generell keine Möglichkeit Objekte selbst freizugeben - man kann jedoch den Garbage Collector dazu anregen sofort tätig zu werden mittels GC.Collect() (siehe auch: http://msdn.microsoft.com/en-us/libr...57(VS.95).aspx).
Wenn du tatsächlich weißt dass du gerade viel nicht mehr refrenzierst, dann kann das evtl. interessant sein - generell ist es aber immer eine gute Idee sich eher darauf zu konzentrieren wirklich keine Referenzen mehr zu haben (weil die Objekte sonst vom GC nicht weggeräumt werden) als darauf sie wegzuwerfen (dafür gibt es dann nie Zeiger die ins nichts gehen).
Vom Design her sind die Pages eigentlich so gedacht, dass man alle für sie relevanten Parameter wirklich als Page-Parameter mitgibt und den Rest eben persistiert (wie in der Web-Programmierung). Das ist vor allem auch deshalb wichtig, damit die Anwendung auch nach dem Tombstoning funktioniert (da wird nämlich eben nur das Dictionary und die Page-URLs aufgehoben, der Prozess der App wird da beendet und beim Neustart ja nur dorthin navigiert wo man vorher war (also auf die Page-URL)).
D.h. insbesondere auch, dass der Zurück-Button (so er wirklich auf die alte Instanz zurückgeht) dann spätestens nach dem Tombstoning auch wieder auf eine neue Instanz kommen würde.
Zur Speicherverwaltung generell - sobald es keine Referenz auf ein Objekt mehr gibt, die von irgendeinem Thread aus erreichbar ist (man also sowieso keinen Zugriff mehr darauf hat - es wird auch erkannt wenn zwei Objekte die sich gegenseitig referenzieren vom Programm aus nicht mehr erreichbar sind) wird es früher oder später weggeworfen - wenn wenig Speicher da ist, dann halt eher früher als später.
Wie man das mit den Werten löst ist eine gute Frage - man kann das ganze natürlich auch XML-Serialisieren statt direkt im Dictionary abzulegen. Persistiert man die Werte allerdings sofort hat man später auch keine Kopfschmerzen mit dem Tombstoning. Ansonsten ist das Dictionary wohl momentan die "Best Practice" - zumindest ist es der Weg der bisher in praktisch allen von Microsoft hergezeigten Tutorials gewählt wurde.
AW: Speicher nur Garbage Collector ?
Vielen dank für deine Präzise Antwort. Ich hoffe hier weiterhin auf solche Hilfen :)
Ist echt ein Umstieg für mich, da auf dem iPhone kein GC existiert und alles über Reference Couting abläuft.
AW: Speicher nur Garbage Collector ?
Na ja, der Umstieg zwischen Managed und Native halt. Wer weiß was er tut kann mit Native mehr Performance rausholen (weil man viele Checks die die Managed Umgebung immer macht halt weglassen kann, Array-Überlauf, etc. - zumindest in C++ vs. C# - in C# kommt da immer eine Exception in C++ ist das immer so ne Frage obs gleich kracht, später oder gar nicht (aber dann is irgendwas anderes kaputt)). Hast bisher mit C++ oder Objective C gearbeitet?
Na egal, freut mich wenn ich dir weiterhelfen konnte. Ansonsten alles Gute für weitere Projekte und den Umgang mit C#.
AW: Speicher nur Garbage Collector ?
Zitat:
Wer weiß was er tut kann mit Native mehr Performance rausholen
Yep und bislang bin ich auch so ziemlich gut gefahren.
Zitat:
Zitat von
StevieBallz
Hast bisher mit C++ oder Objective C gearbeitet?
Angefangen hat alles bei mir mit der Webentwicklung, bis ich dann vor 6 Jahren mit Objective C angefangen habe und dran geblieben bin. Derzeit lerne ich neben C# noch C++.
Zitat:
freut mich wenn ich dir weiterhelfen konnte. Ansonsten alles Gute für weitere Projekte und den Umgang mit C#.
Ja sehr sogar. Mein eigenes App werde ich denke ich gegen ende nächster Woche fertigstellen. Wie lange dauert der Einstellungsprozess bei MS eig. im normalfall ?