[...] ¿es posible verificar si un objeto realmente está observando esa propiedad ?
No. Cuando se trata de MVA que siempre debe tener el siguiente modelo en mente:
Al establecer una observación que es responsable de la eliminación de esa observación exacta. Una observación se identifica por su contexto; por lo tanto, el contexto debe ser único. Al recibir notificaciones (y, en Lion, al eliminar al observador), siempre debe probar el contexto, no la ruta.
La mejor práctica para la manipulación de objetos observados se, para eliminar y establecer la observación en la incubadora del objeto observado:
static int fooObservanceContext;
- (void)setFoo:(Foo *)foo
{
[_foo removeObserver:self forKeyPath:@"bar" context:&fooObservanceContext];
_foo = foo; // or whatever ownership handling is needed.
[foo addObserver:self forKeyPath:@"bar" options:0 context:&fooObservanceContext];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (context == &fooObservanceContext) {
// handle change
} else {
// not my observer callback
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
- (void)dealloc
{
self.foo = nil; // removes observer
}
Al utilizar MVA usted tiene que asegurarse de que ambos objetos, el observador y el observado, están vivos mientras la observación esté en su lugar.
Al agregar una observación, tiene que equilibrar esto con exactamente una eliminación de la misma observación. No asuma, usted es el único que usa KVO. Las clases de Framework pueden usar KVO para sus propios fines, de modo que siempre verifique el contexto en la devolución de llamada.
Una última cuestión que me gustaría señalar: la propiedad observada tiene que ser compatible con KVO. You can't just observe anything.
KVO ya que tiene una API bastante tosca. Hay bibliotecas disponibles que simplifican su uso e incluso le permiten usar bloques por conveniencia. Visita http://thirdcog.eu/pwcblocks/#goodies para más detalles. También tengo mi propia implementación con la capacidad de eliminar observadores automáticamente cuando cualquiera de los objetos se desasigna. Todavía no se ha probado en aplicaciones reales, pero es posible que desee echar un vistazo de todos modos. Busque 'tastykvo' en GitHub. –