Почему добавление "динамических" исправляет проблемы с плохим доступом?
У меня возникла странная проблема с iOS 8 Beta 5 (эта проблема не возникала в предыдущих версиях).
Я попытался создать пустой проект и попытаться реплицировать проблему, но я не могу этого сделать, поэтому я не совсем уверен, где проблема.
Что я вижу, так это то, что попытка доступа к методам пользовательского подкласса NSManagedObject
приводит к странной ошибке EXC_BAD_ACCESS.
Например:
var titleWithComma: String {
return "\(self.title),"
}
Этот метод, из многих других, вызывает эту проблему при вызове. Однако добавление ключевого слова dynamic
перед тем, как проблема исчезнет:
dynamic var titleWithComma: String {
return "\(self.title),"
}
Я знаю, что не даю достаточно информации, потому что я честно не знаю, как точно определить проблему, но может ли кто-нибудь объяснить, что может произойти, и почему добавление dynamic
может решить эту проблему?
Ответы
Ответ 1
Из справочника Swift Language (справочник по языку > декларации > модификатор декларации)
Применить этот модификатор к любому члену класса, который может быть представлен на Objective-C. Когда вы отмечаете объявление участника динамическим модификатор, доступ к этому элементу всегда динамически отправляется с использованием Objective-C время выполнения. Доступ к этому члену никогда не девиртуализированный компилятором.
Поскольку объявления, помеченные динамическим модификатором, отправляются используя Objective-C runtime, theyre неявно отмечен objc атрибут.
Это означает, что ваше свойство/метод может получить доступ к коду или классу Objective-C. Обычно это происходит, когда вы подклассифицируете класс Swift базового класса Objective-C.
Ответ 2
Это из документации совместимости Swift/ Objective-C:
Реализация подклассов управляемого объекта данных
Core Data предоставляет базовое хранилище и реализацию свойств в подклассах класса NSManagedObject. Добавьте атрибут @NSManaged
перед каждым определением свойства в подклассе управляемого объекта, который соответствует атрибуту или отношениям в вашей модели Core Data. Как и атрибут @dynamic
в Objective-C, атрибут @NSManaged
сообщает компилятору Swift, что хранение и реализация свойства будут предоставлены во время выполнения. Однако, в отличие от @dynamic
, атрибут @NSManaged
доступен только для поддержки Core Data.
Итак, из-за некоторых функций времени выполнения Objective-C, которые Core Data использует под обложками, свойства Swift нужно специально аннотировать.