【问题标题】:Swift 2, warning: could not load any Objective-C class information from the dyld shared cacheSwift 2,警告:无法从 dyld 共享缓存中加载任何 Objective-C 类信息
【发布时间】:2015-10-04 13:06:12
【问题描述】:

我发现了一些关于这个问题的问题,但没有一个对我的问题有帮助。我正在尝试使用此代码将对象保存到核心数据(在 Xcode 6 和模拟器中运行良好......):

let fetchRequest = NSFetchRequest(entityName: "Patient")
let fetchedResults : [NSManagedObject]!
do {
    fetchedResults = try managedContext.executeFetchRequest(fetchRequest) as! [NSManagedObject]
    patienten = fetchedResults
}    catch {
    print("error")
}

当我开始在 Xcode 7 beta 和物理设备中处理这个项目时,我添加了 do-try-catch。 现在,当我点击保存按钮时,这段代码被调用,应用程序冻结,我得到以下信息:

警告:无法从 dyld 共享缓存加载任何 Objective-C 类信息。这将显着降低可用类型信息的质量。

有人知道我哪里出错了吗?

【问题讨论】:

  • 我建议将您的打印语句更改为实际打印出错误:print("Error: \(error)"),然后查看实际错误是什么。
  • 当你在当前版本的 Xcode 中使用 swift 时,你得到的警告往往会发生。它可能与您的问题有关,也可能无关。

标签: xcode core-data console swift2 xcode7


【解决方案1】:

对于将来遇到此问题的任何人,我自己也遇到了这个问题,结果发现我实际上是从递归函数中得到堆栈溢出。

显然,在 NSObject 上调用 setValue:forKey: 会调用相应的 set[Key] 函数,其中 [Key] 是您为 forKey 部分指定的(大写)名称。

所以,如果像我一样,你的代码如下所示,它会导致无限循环并崩溃。

func setName(name: String) {
    self.setValue(name, forKey: "name")
}

【讨论】:

  • 有一个不同的场景,但同样的问题,无限递归。该错误完全具有误导性。 +1
  • :) 也相同,但我将字典对象添加到同一个字典中,如 NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; [dict setValue:dict forKey:API_PARAM];
【解决方案2】:

选择Product > Clean

我有类似的问题。我从设备中删除了该应用程序。然后在 XCode 菜单中选择“Product->Clean”。当我再次运行该应用程序时,问题得到了解决。

【讨论】:

  • 也感谢在 XCode 版本 7.2.1 (7C1002) 上为我修复了它
  • 在 XCode v7.3.1 上以这种方式修复了问题
  • 也为我修复了它。应该是公认的答案。问题的另一个症状:NSSet 和 NSArray 没有在调试器的变量/值窗格中公开它们的元素。在 Product > Clean 之后,(a) 错误消息消失了,并且 (b) 集合元素出现在窗格中。
【解决方案3】:

斯威夫特 3:

其实这个问题经常发生在输入中有任何属性声明为NSError类型并且编译器期望Error输出时,所以将输入类型更改为Error通常可以解决这个问题。

【讨论】:

    【解决方案4】:

    是什么帮助了我解决类似的问题(xCode 7、Swift 2):

    阅读this question

    或者在不解释解决方案原因的情况下更快:只需在您的 NSManagedObjectSubclass 中评论 @objc(className) ,这是从您的 CoreData 实体生成的(@objc(Patient) - 在您的情况下)。

    此解决方案(如果问题仍然存在)不适用于 xCode 7.1/Swift 2.1,因为生成 NSManagedObjectSubclasses 的方式已更改。

    不要忘记清理您的项目 (Product > Clean) 并从您的设备/模拟器中删除应用以替换其上的 CoreData 存储。

    【讨论】:

    • 这是您要找的东西吗?)
    【解决方案5】:
    let fetchRequest = NSFetchRequest(entityName: "Patient")
    
    do {
      let fetchedResults = try managedObjectContext!.executeFetchRequest(fetchRequest)
      print("\(fetchedResults)")
    } catch {
      print("error")
    }
    

    上面的代码对我有用。 也许问题可能在于您的核心数据是如何管理的。

    1. 检查您的managedObjectContext 是否真的被创建了。
    2. 检查核心数据的建模

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      • 2023-03-06
      相关资源
      最近更新 更多