Скажем, у меня есть класс вроде этого:
@interface MyAwesomeClass : NSObject
{
@private
NSString *thing1;
NSString *thing2;
}
@property (retain) NSString *thing1;
@property (retain) NSString *thing2;
@end
@implementation MyAwesomeClass
@synthesize thing1, thing1;
@end
При доступе к thing1
и thing2
внутренне (т.е. в рамках реализации MyAwesomeClass
) лучше использовать свойство или просто ссылаться на переменную экземпляра напрямую (при условии, что мы не делаем никаких работать в "пользовательском" доступе или мутаторе, т.е. мы просто устанавливаем и получаем переменную). Pre-Objective C 2.0, мы обычно просто получаем доступ к ivars напрямую, но каков обычный стиль кодирования/лучшая практика сейчас? И изменилась ли эта рекомендация, если переменная/свойство экземпляра является частной и вообще недоступной вне класса? Должны ли вы создавать свойство для каждого ivar, даже если они являются частными, или только для данных с открытым доступом? Что делать, если мое приложение не использует функции кодирования ключевых значений (поскольку KVC работает только для доступа к свойствам)?
Мне интересно смотреть за техническими деталями низкого уровня. Например, данный (субоптимальный) код, например:
@interface MyAwesomeClass : NSObject
{
id myObj;
}
@proprety id myObj;
@end
@implementation MyAwesomeClass
@synthesize myObj;
@end
Я знаю, что myObj = anotherObject
функционально совпадает с self.myObj = anotherObj
.
Но свойства - это не просто причудливый синтаксис для инструктирования компилятора, чтобы, конечно, писать аксессоры и мутаторы; они также способ улучшить инкапсуляцию данных, т.е. вы можете изменить внутреннюю реализацию класса, не переписывая классы, которые полагаются на эти свойства. Меня интересуют ответы, которые затрагивают важность этой проблемы инкапсуляции при работе с собственным внутренним кодом класса. Кроме того, правильно написанные свойства могут запускать уведомления KVC, но прямой доступ к ivar не будет; это имеет значение, если мое приложение не использует функции KVC сейчас, на всякий случай, если это возможно в будущем?