Подтвердить что ты не робот

Почему добавление "динамических" исправляет проблемы с плохим доступом?

У меня возникла странная проблема с iOS 8 Beta 5 (эта проблема не возникала в предыдущих версиях).

Я попытался создать пустой проект и попытаться реплицировать проблему, но я не могу этого сделать, поэтому я не совсем уверен, где проблема.

Что я вижу, так это то, что попытка доступа к методам пользовательского подкласса NSManagedObject приводит к странной ошибке EXC_BAD_ACCESS.

Например:

  var titleWithComma: String {
       return "\(self.title),"
  }

Этот метод, из многих других, вызывает эту проблему при вызове. Однако добавление ключевого слова dynamic перед тем, как проблема исчезнет:

  dynamic var titleWithComma: String {
       return "\(self.title),"
  }

Я знаю, что не даю достаточно информации, потому что я честно не знаю, как точно определить проблему, но может ли кто-нибудь объяснить, что может произойти, и почему добавление dynamic может решить эту проблему?

4b9b3361

Ответ 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 нужно специально аннотировать.