我们在应用程序商店中有一个应用程序可以在 iPhone 4g/4gs 上正常运行,但是当我在 iPod 上测试它时,我感到很惊讶,因为它总是在“随机”位置崩溃。查看 strack 痕迹,我的 View Controller 似乎已被 GC。
如果我写这样的方法,viewcontroller 会被垃圾回收吗:
public void PushShowTeamController (Object a)
{
var teamController = new TeamController (a);
NavigationController.PushViewController (teamController, true);
}
因为 iPod 突然抛出这样的错误:
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 ---
最佳答案
当一个托管对象被释放时(当没有引用留给一个实例时)并且该对象稍后被本地重新浮出水面时会发生这种情况> 代码。
您需要确保对 MyApp.TeamController
的引用保存在托管代码中,只要 native 代码需要(例如访问)即可。
在大多数情况下,MonoTouch 将确保保留引用。您的代码:
NavigationController.PushViewController (teamController, true);
是正确的,UINavigationController
将保留对您的 teamController
的引用。但是,如果您在另一个 Controller 上调用 PushViewController
,那么第一个引用将被覆盖并可由垃圾收集器 (GC) 收集。这种情况会导致您看到的异常。
注意:因为您无法预测 GC 何时会收集未引用的对象实例,所以异常似乎是随机抛出的。
关于xamarin.ios - 选择器从 objective-c 在已被 GC 处理的托管对象上调用,如何避免 View Controller 被 GC 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8762378/