2010-07-16 8 views
9

pensé que se suponía que los emisores @property caseras a tener este aspecto:¿Necesita llamar a willChangeValueForKey: y didChangeValueForKey :?

-(void) setFoo:(Foo *)newFoo { 

    // Safeguards 
    // ... 

    [self willChangeValueForKey:@"foo"]; 
    // Switcheroo 
    // ... 
    [self didChangeValueForKey:@"foo"]; 
} 

Pero veo una gran cantidad de código en las entradas del blog por personas que han estado haciendo cacao mucho más tiempo que tengo, donde la cosa es así:

-(void) setFoo(Foo *)newFoo { 

    // Safeguards 
    // ... 

    // Switcheroo 
    // ... 
} 

Así que mi pregunta es, qué tenemos que llamar a los métodos de MVA-notificación? ¿O se está haciendo mágicamente cuando actualizas el iVar privado, si estás utilizando el tiempo de ejecución moderno?

Respuesta

13

Se hace mágicamente a menos que usted opte por no participar. lea this section de la guía KVO. Tenga en cuenta que KVC/KVO existía desde tiempos inmemoriales (es decir, antes de la introducción de @property) por lo que no importa si el colocador es @synthesize d o no. Ni siquiera está relacionado con la dicotomía vieja/nueva del tiempo de ejecución.

El detalle de esta magia (isa-swizzling) se detalla en un blog post por Mike Ash. Es magia. Básicamente, cuando se observa una clave, el tiempo de ejecución reemplaza automágicamente la implementación del setter para que llame a la notificación KVO.

+0

El enlace de la guía KVO está roto (( – voromax

+0

@voromax Se corrigió el enlace – herzbube

Cuestiones relacionadas