实例化领域对象时的 EXC_BAD_INSTRUCTION

Posted

技术标签:

【中文标题】实例化领域对象时的 EXC_BAD_INSTRUCTION【英文标题】:EXC_BAD_INSTRUCTION when instantiating a Realm Object 【发布时间】:2018-12-06 19:47:08 【问题描述】:

我有一个名为 Dog 的 Realm 对象:

import RealmSwift

class Dog: Object 
    @objc dynamic var name = ""
    @objc dynamic var age = 0

但是,当我尝试实例化它时

let myDog = Dog()

我收到此错误:

线程 1:EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)

我也在“所有输出”窗口中看到了这个,但我不确定它是否会导致崩溃:

SampleApp[25047:274257] *** NSForwarding: warning: object 0x10ba06d20 of class 'SDK.Dog' does not implement methodSignatureForSelector: -- 你忘了声明'SDK.Dog'的超类吗?

2018-12-06 14:02:06.243187-0600 SampleApp[25047:274257] *** NSForwarding: 警告: 'SDK.Dog' 类的对象 0x10ba06d20 未实现 doesNotRecognizeSelector: -- 中止

这是 SDK 的链接框架和库,我需要将它们设为可选才能构建 SampleApp。

【问题讨论】:

你应该设置一个异常断点,看看实际的错误信息是什么。 我更新了我的问题 一些事情。手动添加框架很痛苦。您应该创建一个 podFile 并让 cocoaPods.app 为您完成所有工作。其次 - 您是从 .xcworkspace 文件而不是 .xcodeproj 文件打开项目吗? 【参考方案1】:

你正在使用 RealmSwift,如果你想声明 @objc 动态变量,你也需要使用 Realm for Objective-C。您声明的 Object 需要从 NSObject 继承才能使其正常工作,并且您看到的错误表明您的对象无法实现该超类实现的某些必需方法。

尝试将 RealmSwift.framework 和 Realm.framework 添加到您的项目中。

【讨论】:

我已将 Realm 和 RealmSwift 添加到 SDK 中,并将 SDK 链接到示例应用程序。我认为 Realm 和 RealmSwift 并没有延续到示例应用程序中。 如果 Object 没有实现 methodSignatureForSelector: 和 doesNotRecognizeSelector: ,则 Realm.framework 似乎丢失了。这两个都是由 NSObject 实现的。 您知道如何确保 pod 包含在 SDK.framework 中吗?我更新了我的问题以显示链接的框架和库。 我会先尝试按照此处的说明手动将 Realm 添加为动态库。 realm.io/docs/swift/latest/#dynamic-install 如果您的问题得到解决,那么可以肯定地说链接不正确。

以上是关于实例化领域对象时的 EXC_BAD_INSTRUCTION的主要内容,如果未能解决你的问题,请参考以下文章

Java实例化对象时的初始化

使用 Java 8 流时的新对象实例化

在swift 3中从字符串实例化领域对象

使用 vector<vector<int> > 成员实例化对象时的段错误

使用 Core Data 时的模型实例化问题

JVM之对象的实例化内存布局与访问定位