intaxe @dot vs sintaxe de método com getter =

Não tenho certeza de quanto essa pergunta é útil, mas me parece interessante ...

Eu pensei que usar declarações de propriedade / sintetizar era equivalente a criar o getter / setter. Portant

// .h
@property (nonatomic) BOOL on;

// .m
@synthesize on = _on;

// In my mind synthesizes the following methods

// - (BOOL)on;
// - (void)setOn:(BOOL)on;

No entanto, se eu alterar as declarações para o seguinte:

                              v
@property (nonatomic, getter=isOn) BOOL on;

@synthesize on = _on;

// In my mind synthesizes the following

// - (BOOL)isOn;
// - (void)setOn:(BOOL)on;

Então, considerando o exposto, eu substituo o getter para que eu saiba quando é chamado:

- (BOOL)isOn;
{
    NSLog(@"I was called");
    return _on;
}

Agora chamando o seguinte em uma instância myClass) resulta em

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

Sempre assumi que, se eu estivesse usando uma propriedade nesse sentido, seria perfeitamente válido usar o getter / setter com sintaxe de ponto no formato

myClass.isOn;
myClass.on = on;

De outroquestã foi sugerido que, ao usar a sintaxe de ponto, eu usasse o nome da propriedade assim:

myClass.on   // Correct
myClass.isOn // Incorrect

Embora isso funcione, parece um pouco menos lógico, porque eu sei que não há método subjacente- (BOOL)on, em vez disso, é mapeado para- (BOOL)isOn

Minhas perguntas são (usando o último exemplo)

Isso é um bug ou deveriamyClass.on realmente mude silenciosamente para chamar- (BOOL)isOnSempre falando que estou acessando o estado, não invocando comportamento, o uso atual da sintaxe de pontos está correto? (por exemplo.myClass.isOn)Atualiza

Embora ninguém tenha dito explicitamente que eu raciocinei que usando.isOn está em má forma porque, independentemente do fato de que, sob o capô, o mesmo método é chamado, semanticamenteisOn está fazendo uma pergunta, que é mais um comportamento do que um estad

No entanto, ainda não estou claro sobre onde a fiação "mágica" acontece, que liga as chamadas paramyClass.on para dentro[myClass isOn]

Update 2

Após ver os documentos um pouco mais, encontrei esta seção em Propriedades declaradas. Usando o código a seguir, posso inspecionar as propriedades de uma classe:

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

Então, temos os seguintes atributos:

name = ontype = char (Tc)getter = isOn (GisOn)variable = _on (V_on)

Com todas essas informações disponíveis em tempo de execução, isso deixa a pergunta: essa pesquisa é feita em tempo de execução ou em tempo de compilação, como sugerem algumas resposta

questionAnswers(8)

yourAnswerToTheQuestion