Я не уверен, насколько полезен этот вопрос, но мне он кажется интересным ...
Я думал, что использование свойств / синтезирующих операторов эквивалентно тому, что я создал геттер / сеттер. Поэтому
// .h
@property (nonatomic) BOOL on;
// .m
@synthesize on = _on;
// In my mind synthesizes the following methods
// - (BOOL)on;
// - (void)setOn:(BOOL)on;
Однако, если я изменю декларации на следующие:
v
@property (nonatomic, getter=isOn) BOOL on;
@synthesize on = _on;
// In my mind synthesizes the following
// - (BOOL)isOn;
// - (void)setOn:(BOOL)on;
Затем, учитывая вышесказанное, я переопределяю геттер, чтобы знать, когда он называется:
- (BOOL)isOn;
{
NSLog(@"I was called");
return _on;
}
Теперь вызов следующего для экземпляра (myClass
) приводит к:
NSLog(@"%d", [myClass isOn]);
//=> 2012-02-09 22:18:04.818 Untitled[1569:707] I was called
//=> 2012-02-09 22:18:04.820 Untitled[1569:707] 1
NSLog(@"%d", myClass.isOn);
//=> 2012-02-09 22:18:24.859 Untitled[1599:707] I was called
//=> 2012-02-09 22:18:24.861 Untitled[1599:707] 1
NSLog(@"%d", myClass.on); // This is the one I didn't expect to work
//=> 2012-02-09 22:18:55.568 Untitled[1629:707] I was called
//=> 2012-02-09 22:18:55.570 Untitled[1629:707] 1
Я всегда предполагал, что если бы я использовал свойство в этом смысле, было бы совершенно правильно использовать метод получения / установки с точечным синтаксисом в форме
myClass.isOn;
myClass.on = on;
Из другого вопроса было предложено, чтобы при использовании точечного синтаксиса я использовал имя свойства следующим образом:
myClass.on // Correct
myClass.isOn // Incorrect
Хотя это работает, это кажется немного менее логичным, потому что я знаю, что нет базового метода - (BOOL)on
, вместо этого он сопоставлен с - (BOOL)isOn
Мои вопросы (на последнем примере)
- Является ли это ошибкой или
myClass.on
действительно нужно молча изменить на вызов - (BOOL)isOn
- С семантической точки зрения, я обращаюсь к состоянию, а не к поведению, так правильно ли мое текущее использование синтаксиса точек? (например,
myClass.isOn
)
Обновление
Хотя никто прямо не сказал об этом, у меня есть основания полагать, что использование .isOn
является плохим тоном, потому что независимо от того, что под капотом вызывается один и тот же метод, семантически isOn
задает вопрос, а это скорее поведение чем государство.
Однако мне все еще неясно, где происходит "волшебная" проводка, которая превращает вызовы на myClass.on
в [myClass isOn]
Обновление 2
После просмотра документов я нашел этот раздел в Объявленные свойства . Используя следующий код, я могу проверить свойства класса:
id MyClass = objc_getClass("MyClass");
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList(MyClass, &outCount);
for (i = 0; i < outCount; i++) {
objc_property_t property = properties[i];
NSLog(@"Name: %s, attributes: %s\n", property_getName(property), property_getAttributes(property));
}
//=> 2012-02-10 07:10:28.333 Untitled[934:707] Name: on, attributes: Tc,GisOn,V_on
Итак, у нас есть следующие атрибуты:
- name = on
- type = char (Tc)
- getter = isOn (GisOn)
- переменная = _on (V_on)
Имея всю эту информацию, доступную во время выполнения, она как бы оставляет вопрос: выполняется ли этот поиск во время выполнения или во время компиляции, как предлагают некоторые ответы?