Swift 2, предупреждение: не удалось загрузить информацию класса Objective-C из dyld-общего кэша
Я нашел несколько вопросов по этой проблеме, но ни один из них не помог мне в моей проблеме. Я пытаюсь сохранить объект для основных данных с помощью этого кода (который отлично работал в Xcode 6 и Simulator...):
let fetchRequest = NSFetchRequest(entityName: "Patient")
let fetchedResults : [NSManagedObject]!
do {
fetchedResults = try managedContext.executeFetchRequest(fetchRequest) as! [NSManagedObject]
patienten = fetchedResults
} catch {
print("error")
}
Я добавил try-try-catch, когда начал работать над этим проектом в бета-версии Xcode 7 и физическом устройстве.
Теперь, когда я нажимаю кнопку "Сохранить", этот фрагмент кода вызывается, приложение зависает, и я получаю следующее:
предупреждение: не удалось загрузить информацию класса Objective-C из dyld-общего кэша. Это значительно снизит качество информации о типе.
![Снимок экрана]()
Кто-нибудь знает, где я ошибся?
Ответы
Ответ 1
Для тех, кто сталкивается с этим в будущем, я просто столкнулся с этой проблемой, и оказалось, что на самом деле я получаю переполнение стека из рекурсивной функции.
Очевидно, вызов setValue:forKey:
в NSObject вызывает соответствующую функцию set[Key]
, где [Key]
- это (заглавное) имя, которое вы передали в раздел forKey
.
Итак, если у меня есть код, который выглядит следующим образом, он вызовет бесконечный цикл и сбой.
func setName(name: String) {
self.setValue(name, forKey: "name")
}
Ответ 2
Выберите Product
> Clean
У меня была аналогичная проблема. Я удалил приложение с устройства. Затем "Продукт- > Очистить" в меню XCode. Когда я снова запустил приложение, проблема была решена.
Ответ 3
Swift 3:
На самом деле эта проблема возникает часто, когда у вас есть какое-либо свойство во вводе, объявленное как тип NSError
, и компилятор ожидает выход Error
, поэтому изменение типа ввода на Error
обычно решает эту проблему.
Ответ 4
Что помогло мне в аналогичной проблеме (xCode 7, Swift 2):
чтение этого вопроса
Или быстрее, не объясняя причины решения: просто напишите @objc(className)
в NSManagedObjectSubclass
, который был создан из вашего объекта 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")
}
Этот код работал у меня.
Возможно, проблема связана с управлением вашими основными данными.
- Проверьте, действительно ли создан ваш
managedObjectContext
.
- Проверьте моделирование основных данных