Wie ich es verstehe, müssen wir Verweise auf unsere Cocoa Objekte halten, wenn sie mit ihnen in Monotouch handelt. Der Grund dafür ist, dass die ObjC-Laufzeit möglicherweise noch Verweise auf die Objekte enthält, und wenn wir keine "MonoTouch-Verweise" auf ihnen haben, könnten sie Müll gesammelt werden, was zu einem EXC_BAD_ACCESS
führt, sobald die ObjC-Laufzeit versucht, auf sie zuzugreifen .Release/verfügt über einen UIViewController in Monotouch
Sag mal, haben wir zwei UIViewController Unterklassen, VC1 und VC2. Wenn der Benutzer auf eine Schaltfläche auf VC1 klickt, navigiert die Benutzeroberfläche zu VC2, und der Benutzer kann vor und zurück navigieren. Wenn ich jedes Mal, wenn der Benutzer zu ihm navigiert, eine neue Instanz von VC2 erstelle, gehen die Verweise auf die alten Instanzen verloren. Daher werden sie als Müll gesammelt und die App stürzt beim nächsten Mal ab, wenn ein didReceiveMemoryWarning
an die UIViewControllers weitergegeben wird.
Wie kann ich die alten Referenzen freigeben, so habe ich nicht jedes Mal die gleiche Instanz von VC2 verwenden? Dispose
schien nicht genug zu sein.
Vielen Dank, aber ich bin mir sicher, dass ich keine Referenzen mehr habe. Die einzige verwaltete Sache, die 'VC2' referenziert, ist meine' VC1'-Instanz. Wenn ich diese Instanz auf null setze, sollte die Referenzzahl auf der nativen 'VC2'-Instanz 0 sein. Aber es scheint, dass iOS einen Verweis auf die Controller für die Verteilung von 'didReceiveMemoryWarning'-Nachrichten, da, sobald es eine 'didReceiveMemoryWarning'-Nachricht gibt, meine App abstürzt. – cheeesus
Sie haben wahrscheinlich keine ** verwalteten ** Referenzen, aber Sie könnten durchaus ** native ** Referenzen (zwischen ihnen oder deren Eltern) haben. Sie sollten sie nicht aufheben (verwaltete Seite), bevor Sie sicher sind, dass ihr Lebenszyklus (native Seite) abgelaufen ist, da sie wieder in eine entsorgte (verwaltete) Instanz zurückrufen kann. Wenn Sie einen kleinen Testfall haben (oder extrahieren können), öffnen Sie einen Fehlerbericht unter http://bugzilla.xamarin.com und wir überprüfen den Code. – poupou
Ok, ich versuche es zu isolieren. Danke für Ihre Hilfe. – cheeesus