Я не уверен, как много использовать этот вопрос, но мне кажется интересным...
Я думал, что использование операторов property/synthesize эквивалентно мне, создающему getter/setter. Поэтому
// .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;
Из другого question было высказано предположение, что при использовании точечного синтаксиса я должен использовать имя свойства следующим образом:
myClass.on // Correct
myClass.isOn // Incorrect
Хотя это работает, кажется немного менее логичным, потому что я знаю, что нет базового метода - (BOOL)on
вместо этого отображается на - (BOOL)isOn
Мои вопросы (с использованием последнего примера)
- Является ли это ошибкой или должен
myClass.on
действительно быть тихо изменен для вызова- (BOOL)isOn
- Семантически говоря, я обращаюсь к состоянию, не вызывающему поведение, так верно ли мое нынешнее использование точечного синтаксиса? (например,
myClass.isOn
)
Update
Хотя никто прямо не сказал, что я рассуждал, что использование .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)
- variable = _on (V_on)
Со всей этой информацией, доступной во время выполнения, возникает вопрос: этот поиск выполняется во время выполнения или время компиляции, как предлагают некоторые ответы?