Как автоматически генерируемые переменные экземпляра работают в NSManagedObjects?
Xcode 4.5 и позже автоматически синтезируют свойства, делая переменную экземпляра с подчеркиванием, добавленным перед именем свойства. Но как это работает в NSManagedObject? Они хотят, чтобы вы использовали примитивные методы KVC в ваших пользовательских установках. Так что же произойдет, если вы установите переменную экземпляра с помощью подчеркивания ivar внутри NSManagedObject? Разве это не облажается, так как это обойдёт методы KVC? Или это безопасно делать это за кулисами?
2 ответа
Обратите внимание, что в отличие от обычных свойств, NSManagedObject
свойства не синтезируются во время компиляции (следовательно, использование @dynamic
для реализации). Поскольку синтез во время компиляции не используется, нет доступных для синтеза переменных экземпляра для установки.
Вместо этого случаи NSManagedObject
иметь частный внутренний экземпляр чего-то похожего на NSMutableDictionary
хранить свое состояние. Динамически сгенерированные средства доступа к свойствам являются оболочками для вызовов KVC-подобных методов, которые обращаются к частному хранилищу.
Если вы обращаетесь к переменной экземпляра подчеркивания напрямую, вы игнорируете работу, которая NSManagedObject
делает для вас. Вы должны использовать методы доступа get и set, которые NSManagedObject автоматически генерирует для ваших атрибутов.
Документация Apple гласит
Когда вы обращаетесь к свойствам управляемого объекта или изменяете их, вы должны использовать эти методы [accessor] напрямую.
При необходимости вы можете реализовать свои собственные методы доступа, но в этом случае вам придется проделать дополнительную работу, помимо изменения значения переменной экземпляра:
Вы должны убедиться, что вы вызываете соответствующие методы доступа и уведомляете об изменениях (willAccessValueForKey:, didAccessValueForKey:, willChangeValueForKey:, didChangeValueForKey:, willChangeValueForKey:withSetMutation:usingObjects:, и didChangeValueForKey: usingOject: with
Это должно показать, что вы не можете получить правильное поведение, просто изменив переменную экземпляра напрямую.