2011-10-14 3 views
0

У меня есть объект Data Data Series с переходным attr indexCurrent. Когда внешние классы получают доступ indexCurrent, я хочу, чтобы они отправляли в arg, который может быть использован для проверки того, нужно ли обновлять значение indexCurrent перед его возвратом. Поэтому я объявил indexCurrent в качестве частной переменной и разрешил доступ к нему только через этот специальный метод с аргументом arg.Невозможно сделать атрибут переходных данных основного данных private

Но, несмотря на то, что предупреждения компилятора не распознаются «методом не найдены», он позволяет внешним классам звонить как indexCurrent, так и setindexCurrent:, и этот неисправный код выполняется с полным успехом.

Вот Series интерфейс:

@interface Series : NSManagedObject { 
@private 
NSNumber *indexCurrent; 
} 

indexCurrent не propertized, не объявлен как динамический в файле реализации, и я не написал indexCurrent или setindexCurrent: аксессоров.

Что я делаю неправильно? Как я могу сделать indexCurrent частным?

ответ

2

@dynamic не вызывает никакого кода. Core Data генерирует код для аксессуаров свойств, независимо от того, используете ли вы @dynamic. @dynamic просто сообщает компилятору, что код будет сгенерирован, поэтому ему не нужно предупреждать о отсутствующих методах. Вот почему вы получаете предупреждения, но не ошибки времени выполнения.

@private в переменной экземпляра не делает многого. По умолчанию используется @protected, что означает, что внешние классы не могут получить к нему доступ в любом случае, только сам класс и подклассы. В любом случае, по умолчанию базовые поставщики данных не используют переменные экземпляра.

Я не уверен, как делать то, что вы хотите.

+0

Я считаю, что результатом является то, что это не такая штука, как частные атрибуты управляемого объекта, и мне просто придется полагаться на отсутствие точечного синтаксиса (который не будет работать без строки @property) для обеспечения моего дизайна. Спасибо за ваши объяснения, которые делают хороший урок анатомии на Core Data. – Wienke

+1

Имейте в виду, что вся концепция общедоступной защиты и конфиденциальности на самом деле не является шаблоном проектирования Objective-C. Он существует, но я не стал бы на него полагаться. Маркеры больше для человека, чтобы читать и говорить «о, я не должен касаться этого». Компилятор не будет мешать вам, если вы проигнорируете это предупреждение. –

Смежные вопросы