草庐IT

ios - MonoTouch 自定义 UIButton 在加载时崩溃 : Selector invoked from objective-c on a managed object that has been GC'd

coder 2024-01-20 原文

我正在使用 MonoTouch 并创建了一个扩展 UIButton 的类 MyButton。这实际上是我在使用 custom UIScrollView 时遇到的相同问题的简化示例. MyButton 扩展了 UIButton 并添加了一些方法来做一些简单的事情,比如递增和递减计数器(这只是一个测试用例)。我还在我的类定义之前包含了“[Register("MyButton")]”,以便它向 Interface Builder (IB) 注册,这样我就可以添加一个 UIButton 并将其类指定为 MyButton。

有效的方法: 我可以通过编程方式将 MyButton 的实例添加到我的主视图,它会正确显示并按预期运行。

什么不起作用: 如果我尝试从 IB 添加一个 UIButton 并将其类指定为 MyButton,然后添加一个导出并指定它是 MyButton 类型,那么我的应用程序在尝试加载主视图时崩溃,但出现以下异常:未处理的托管异常:选择器从 iOSCustomUIView.MyButton (0xC2F40D0) 类型的托管对象上的 Objective-c 调用,该对象已被 GC 处理(System.Exception)

我发现类似的问题有这个问题,但 View Controller ,而不是 View 。所以我知道错误是相似的,但是在 View Controller 的情况下,将新 Controller 插入堆栈时引用丢失等。在我的情况下,我不知道为什么我的对象在任何事情发生之前就已经被 GC已加载。

我尝试创建额外的私有(private)成员变量来引用我的 MyButton socket (btnIncrement),但这没有帮助。我设置了断点,并在尝试实例化我的 View Controller 的新实例时发生崩溃:(来自 AppDelegate.cs)

    public override bool FinishedLaunching (UIApplication app, NSDictionary options)
    {
        window = new UIWindow (UIScreen.MainScreen.Bounds);

        viewController = new iOSCustomUIViewViewController ();
        window.RootViewController = viewController;
        window.MakeKeyAndVisible ();

        return true;
    }

为了定义自定义 UIButton 类并在 IB 中使用它,我是否遗漏了什么?这是 MonoTouch 中的错误吗?

最佳答案

我在 Xamarin forum 上得到了 adamkemp 的热烈响应.解决方案是我需要编写一个接受 IntPtr p 参数的构造函数,因为这是从 xib 文件创建 View 对象时调用的构造函数。在我的例子中,我简单地定义了以下构造函数:

public MyButton(IntPtr p) : base(p)
{
    // Do initialization stuff here
}

因为我没有定义这个构造函数,所以我的对象可能从未创建过。在这种情况下,表明我的对象已被 GC 的日志消息有点误导。现在,我的应用程序成功查看了所有加载。

关于ios - MonoTouch 自定义 UIButton 在加载时崩溃 : Selector invoked from objective-c on a managed object that has been GC'd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15433864/

有关ios - MonoTouch 自定义 UIButton 在加载时崩溃 : Selector invoked from objective-c on a managed object that has been GC'd的更多相关文章

随机推荐