如何从 nib 中修复此“在托管对象上调用选择器 ... 已被 GC'ed”,其中包含未使用的自定义 UITableViewCell?

Posted

技术标签:

【中文标题】如何从 nib 中修复此“在托管对象上调用选择器 ... 已被 GC\'ed”,其中包含未使用的自定义 UITableViewCell?【英文标题】:How can I fix this "Selector invoked ... on a managed object ... that has been GC'ed" from nib with unused custom UITableViewCell inside?如何从 nib 中修复此“在托管对象上调用选择器 ... 已被 GC'ed”,其中包含未使用的自定义 UITableViewCell? 【发布时间】:2013-04-22 20:13:01 【问题描述】:

我有一个示例项目,我在其中创建了一个库存表格视图,最终将使用一系列自定义表格视图单元格。表视图的 nib 包含定义了自定义控制器 (TrackingViewController) 的视图,该控制器本身包含一个表视图作为子视图。笔尖还包含一个自定义 UITableViewCell,我有一天会在表格中使用它。但是现在自定义单元格没有在任何地方引用或使用;它只存在于笔尖内。

当应用程序尝试引用自定义视图控制器的视图(即 TrackingViewController 实例的 View 属性)时,应用程序崩溃并显示消息“System.Exception: Selector 从objective-c 在类型为 Empty1 的托管对象上调用.SendDataRowCell (0xCFE4900) 已被 GC 处理”。我还没有实例化可以调用任何选择器的 SendDataRowCell 类的任何实例,所以我不明白这个消息。我没有将对任何自定义单元对象的引用传递给 Objective-C,因为我从未创建过一个。我什至还没有为表格设置 UITableViewSource 实例。

这是我在界面生成器中的 nib 文件的屏幕截图: http://i.imgur.com/wb5zDlp.png

这是一个包含示例项目的所有代码的要点,在该示例项目中,我能够在每次应用启动时始终如一地重现问题。请注意,这不是一个功能齐全的应用程序,也不打算这样做;它只是为了证明这个问题而存在。 https://gist.github.com/cscibri/5437899

我正在 Windows 7 x64 上的 Visual Studio 2012 中构建这个项目,我使用的是 Xamarin Studio 版本 4.0.4 (build 2),monotouch 版本是 6.2.3.0 (8d98f5e)

【问题讨论】:

【参考方案1】:

您需要在您的 SendDataRowCell 类中创建一个采用 IntPtr 的构造函数:

SendDataRowCell (IntPtr handle)
    : base (handle)


这是 ios 实例化 SendDataRowCell 实例时将使用的构造函数。

【讨论】:

那个ctor最初是在生成文件时放在那里的,但我一定是在某个时候不小心删除了。感谢您的帮助!

以上是关于如何从 nib 中修复此“在托管对象上调用选择器 ... 已被 GC'ed”,其中包含未使用的自定义 UITableViewCell?的主要内容,如果未能解决你的问题,请参考以下文章

Interface Builder:如何从 nib 文件加载视图

从nib实例化UIView会导致无限循环问题

从 Nib 加载 NSView 的多个实例

PythonException:从 UDF 引发异常:'ValueError:如何在 Databricks 中修复此错误?

从 nib 加载自定义 UIView 会导致无限循环或抛出 nil 异常

以编程方式更新 nib 的框架和内容