gpt4 book ai didi

xamarin.ios - 选择器从 objective-c 在已被 GC 处理的托管对象上调用,如何避免 View Controller 被 GC 处理

转载 作者:行者123 更新时间:2023-12-01 10:07:47 34 4
gpt4 key购买 nike

我们在应用程序商店中有一个应用程序可以在 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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com