3 Stimmen

Selector, der von Objective-C auf einem verwalteten Objekt aufgerufen wird, das GC'ed wurde, wie kann man vermeiden, dass Viewcontroller GC'd werden

Wir haben eine App im Appstore, die ohne Probleme auf dem iPhone 4g/4gs funktioniert, aber als ich sie auf einem iPod getestet habe, erlebte ich eine Überraschung, denn sie stürzt immer wieder an "zufälligen" Stellen ab. Wenn ich mir die Strack Traces ansehe, scheint es, dass meine Viewcontroller GC'ed wurden.

Wird der Viewcontroller garbagecollected werden, wenn ich Methoden wie diese schreibe:

public void PushShowTeamController (Object a)
{
  var teamController = new TeamController (a);
  NavigationController.PushViewController (teamController, true);
}

Weil der iPod plötzlich eine Fehlermeldung wie diese ausgibt:

 Jan  6 18:52:09 unknown MyApp[5197] <Warning>: Received memory warning.
 Jan  6 18:52:10 unknown UIKitApplication:mypackage.app[0x9db2][5197] <Notice>: Unhandled Exception: System.Exception: Selector invoked from objective-c on a managed object that has been GC'ed ---> System.MissingMethodException: No constructor found for MyApp.TeamController::.ctor(System.IntPtr)
 Jan  6 18:52:10 unknown UIKitApplication:mypackage.app[0x9db2][5197] <Notice>:   at System.Activator.CreateInstance (System.Type type, BindingFlags bindingAttr, System.Reflection.Binder binder, System.Object[] args, System.Globalization.CultureInfo culture, System.Object[] activationAttributes) [0x00000] in <filename unknown>:0 
 Jan  6 18:52:10 unknown UIKitApplication:mypackage.app[0x9db2][5197] <Notice>:   at System.Activator.CreateInstance (System.Type type, System.Object[] args, System.Object[] activationAttributes) [0x00000] in <filename unknown>:0 
 Jan  6 18:52:10 unknown UIKitApplication:mypackage.app[0x9db2][5197] <Notice>:   at System.Activator.CreateInstance (System.Type type, System.Object[] args) [0x00000] in <filename unknown>:0 
 Jan  6 18:52:10 unknown UIKitApplication:mypackage.app[0x9db2][5197] <Notice>:   at MonoTouch.ObjCRuntime.Runtime.ConstructNSObject (IntPtr ptr, IntPtr klass) [0x00000] in <filename unknown>:0 
 Jan  6 18:52:10 unknown UIKitApplication:mypackage.app[0x9db2][5197] <Notice>:   --- End of inner exception stack trace ---

6voto

poupou Punkte 43207

Dies ist der Fall, wenn ein verwaltet Objekt entsorgt wird (wenn kein Verweis auf eine Instanz mehr vorhanden ist) und das Objekt später wiederaufgebaut von nativo código.

Sie müssen sicherstellen, dass ein Verweis auf MyApp.TeamController wird im verwalteten Code aufbewahrt, solange er von nativem Code benötigt wird (z. B. für den Zugriff).

In den meisten Fällen wird MonoTouch dafür sorgen, dass eine Referenz erhalten bleibt. Ihr Code:

NavigationController.PushViewController (teamController, true);

korrekt ist und UINavigationController behält einen Verweis auf Ihre teamController . Wenn Sie jedoch anrufen PushViewController auf einem anderen Controller, wird die erste Referenz überschrieben und kann vom Garbage Collector (GC) eingesammelt werden. Diese Situation würde zu der Ausnahme führen, die Sie sehen.

Hinweis: Da Sie nicht vorhersagen können, wann die GC nicht referenzierte Objektinstanzen sammelt, wird die Ausnahme scheinbar zufällig ausgelöst.

1voto

oblApps Punkte 65

Meiner Erfahrung nach passiert dies, wenn ich viel dispose() auf verwaltete Objekte verwende, anstatt sie auf null zu setzen und die GC ihre Arbeit machen zu lassen. Auch anonyme Delegierte in Kombination mit dispose() können zu solchen Problemen führen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X