синтаксис точки против синтаксиса метода с помощью getter =

Я не уверен, насколько полезен этот вопрос, но мне кажется интересным ...

Я думал, что использование свойств / синтезирующих операторов было эквивалентно тому, что я создал геттер / сеттер. Следовательно

// .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

Итак, у нас есть следующие атрибуты:

имя = вклtype = char (Tc)getter = isOn (GisOn)переменная = _on (V_on)

Со всей этой информацией, доступной во время выполнения, это как бы оставляет вопрос: выполняется ли этот поиск во время выполнения или во время компиляции, как предлагают некоторые ответы?

Ответы на вопрос(4)

Ваш ответ на вопрос