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

标签 xamarin.ios

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

相关文章:

mvvm - 使用tableview作为可搜索输入

c# - 在 Xamarin 中创建 PCL 时,.Net 可移植子集中缺少 HttpClient

c# - 在设备上存储密码

ios - 在没有 UIWebView 的 iOS 设备上显示 .RTF 文件 - iOS 上的 initWithRTF?

c# - 我能否仅使用 Xamarin PCL 以 iOS 和 Android 为目标并拥有更多 .NET 功能?

c# - 用于 Android/MonoTouch System.Net.WebException : Request aborted 的单声道

IOS:提前AOT,是什么?

ios - xamarin 中的 UIView 到 UITextfield

objective-c - 在 UITableView 中插入新行的技术

ios - Monotouch (mtouch) 命令行错误 MT0007 - "The root assembly does not exist"