未能创建本机类型“NSObject”的实例

Posted

技术标签:

【中文标题】未能创建本机类型“NSObject”的实例【英文标题】:Failed to create an instance of the native type '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 模拟器之前它已经工作了。 【参考方案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 发生了什么变化。?

以上是关于未能创建本机类型“NSObject”的实例的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 中从可加载包创建主体类的实例

未能封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配

Cloudformation 未能创建 ecs 服务(在您的集群中未找到任何容器实例。)

使用 Restkit 为 NSManagedObject 类创建实例

AWS Opsworks 未能添加 EC2 实例

WEBSERVICE 分析器错误信息: 未能创建类型