No estoy seguro de cuánto uso a esta pregunta es, pero parece interesante para mí ...Sintaxis con puntos vs sintaxis del método con el captador =
pensé que el uso de la propiedad/sintetizar declaraciones fue equivalente a mí crear el captador /setter. Por lo tanto
// .h
@property (nonatomic) BOOL on;
// .m
@synthesize on = _on;
// In my mind synthesizes the following methods
// - (BOOL)on;
// - (void)setOn:(BOOL)on;
Sin embargo si cambio de las declaraciones a la siguiente:
v
@property (nonatomic, getter=isOn) BOOL on;
@synthesize on = _on;
// In my mind synthesizes the following
// - (BOOL)isOn;
// - (void)setOn:(BOOL)on;
A continuación, dado lo anterior puedo reemplazar el comprador, así que sé cuando se le llama:
- (BOOL)isOn;
{
NSLog(@"I was called");
return _on;
}
Ahora llamando los siguientes en una instancia (myClass
) resulta en:
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
siempre había asumido que si yo estaba usando una propiedad en este sentido, era perfectamente válida para utilizar el captador/definidor con la sintaxis con punto en la forma
myClass.isOn;
myClass.on = on;
De otra question se sugirió que cuando se utilizan puntos la sintaxis que debe utilizar el nombre de la propiedad de esta manera:
myClass.on // Correct
myClass.isOn // Incorrect
Aunque esto funciona parecer un poco menos lógico porque sé que no hay un método subyacente - (BOOL)on
en su lugar se asigna a - (BOOL)isOn
Mis preguntas son (utilizando el último ejemplo)
- Es esto un error o debería
myClass.on
realmente puede cambiar en silencio para llamar- (BOOL)isOn
- hablando Semánticamente accedo estado de comportamiento no invocar por lo que es mi uso actual de sintaxis punto correcta? (Por ejemplo
myClass.isOn
)
actualización
Aunque nadie ha dicho explícitamente que he razonado que el uso de .isOn
es mala forma porque independientemente del hecho de que bajo el capó se llama el mismo método, semánticamente isOn
hace una pregunta, que es más comportamiento que estado.
Sin embargo, estoy todavía no está claro en donde el cableado "mágica" pasa que convierte las llamadas a myClass.on
en [myClass isOn]
Actualización 2
Después de mirar los documentos poco más encontré esta sección sobre Declared Properties.Usando el siguiente código que puedo inspeccionar una clase propiedades:
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
Así que tener los siguientes atributos:
- Name = en
- type = char (Tc)
- captador = Ison (GISON)
- variable = _on (V_on)
Con toda esta información disponible en tiempo de ejecución, deja la pregunta: ¿esta búsqueda se realiza en tiempo de ejecución o en tiempo de compilación como sugieren algunas respuestas?
Obtengo lo que sucede conceptualmente. Estaba tratando de encontrar más documentación en lugar de solo mis observaciones.Por favor, consulte mi actualización que pregunta si esto se hace en tiempo de compilación o en tiempo de ejecución –
@ Paul.s - OK Ejecuté una prueba simple (compilo ambas variantes y miro el ensamblador) y la respuesta es tiempo de compilación, al menos por el Clang actual compilador. Esto tiene sentido como sugerí antes: la información se coloca en el encabezado y no en la implementación. Realmente no puedo imaginar por qué se haría en tiempo de ejecución: la resolución sobre qué método invoca 'customGetter' todavía se hará en tiempo de ejecución. Para que la resolución del tiempo de ejecución del nombre de la propiedad en el nombre de usuario personalizado sea útil en el tiempo de ejecución, deberá querer permitir el cambio de esa asignación en el tiempo de ejecución. – CRD