【问题标题】:Failed to create an instance of the native type 'NSObject'未能创建本机类型“NSObject”的实例
【发布时间】:2013-03-09 11:28:20
【问题描述】:

执行以下代码时出现此错误

未能创建原生类型“NSObject”的实例,可以通过将 Class.ThrowOnInitFailure 设置为 false 来忽略此情况

    var alert=new UIAlertView("Error","Something missing !"
                              ,new UIAlertViewDelegate(),"OK",null);

我仅在最新的 iOS 6 模拟器中收到此错误。 对于我的 iOS 5 设备,它按预期工作。

【问题讨论】:

  • 我不太了解 Monotouch,但在 Objective C 中,UIAlertViewDelegate 不是一个类,它是一个协议,这意味着你不能创建它的实例。
  • 对于c#,您可以获得委托类型的实例(例如Action Func)。 iOS6.1 的实现方式似乎有所不同。在我更新我的 iOS 模拟器之前它已经工作了。

标签: ios xamarin.ios ios-simulator


【解决方案1】:

这是因为最近对 Xamarin.iOS 进行了修改。

传统上,MonoTouch 允许在没有本地对等点的情况下创建托管对象。然而,类型之间的行为是不一致的,对于来自第三方库的类型,它会导致实例,如果使用,很可能会因堆栈溢出而导致进程崩溃。因此,默认行为已更改:如果无法为托管对象创建本机对等点,则会引发异常。由于异常消息还提到此行为由值 MonoTouch.ObjCRuntime.Class.ThrowOnInitFailure 控制 - 将其设置为 false 以返回旧行为。

在您的情况下,您会遇到异常,因为您在没有相应的 Objective-C 类时尝试创建 UIAlertViewDelegate 实例(因为 UIAlertViewDelegate 是 Objective-C 协议,而不是 Objective-C 类)。

解决方案很简单,正如 user1010710 已经提到的,只需使用 null 而不是 new UIAlertViewDelegate()。结果是相同的:在 Xamarin.iOS 的早期版本中,您最终会得到一个托管 UIAlertViewDelegate 实例,其 Handle 为 IntPtr.Zero -并且该 IntPtr.Zero 值将传递给本机构造函数。这正是您传递null 时发生的情况。

【讨论】:

  • 消息说“通过将 Class.ThrowOnInitFailure 设置为 false”而不是“MonoTouch.ObjCRuntime.Class.ThrowOnInitFailure”。您当然知道,看来您编写了代码? github.com/mono/monomac/blob/master/src/Foundation/NSObject.cs感谢您的澄清。+1
  • 我试过 MonoMac.ObjCRuntime 但没有猜对“类”类位置
  • @DavutGürbüz:MonoTouch 和 MonoMac 之间的代码相同(命名空间除外)。不过,关于命名空间的要点很好,我会将其包含在异常消息中。
  • 那我现在准备购买 MonoDevelop!我希望我走在正确的道路上。有些人在这里做 HTML5-Cordova 应用程序。但是我今天要买。谢谢您的大力支持。
【解决方案2】:

试试这个:

var alert = new UIAlertView ("Error", "Something missing !", null, "OK");

【讨论】:

  • 谢谢它解决了。代表是给ctor的,没关系。但是非常有趣的是 ios6 发生了什么变化。?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
相关资源
最近更新 更多