2011-06-06 17 views
7

en mi método de entrada de la subclase NSObject, la instancia se agrega como observador de algunos de sus propios keyPaths para activar una acción que debe ocurrir cada vez que se cambia una de las propiedades en cuestión. p.ej.¿Al usar KVO es necesario eliminar a uno mismo como un observador de sí mismo en -dealloc?

[self addObserver:self forKeyPath:@"aProperty" options:0 context:nil]; 
[self addObserver:self forKeyPath:@"anotherProperty" options:0 context:nil]; 
... 

Mi pregunta es, en el método de la clase -dealloc puedo necesariamente tienen que quitar la instancia como un observador de sí mismo? p.ej.

[self removeObserver:self forKeyPath:@"aProperty"]; 
[self removeObserver:self forKeyPath:@"anotherProperty"]; 
... 

La manera como yo lo veo, cuando un objeto intenta enviar un mensaje a un objeto que no existe una larga continuación, una excepción es lanzada, claramente un problema. Pero en este caso, un objeto que ya no existe posiblemente no podría enviarse mensajes, por lo que no debería ser un problema.

No he tenido ningún problema con esto todavía, pero todavía me molesta ya que nunca lo he visto explícitamente indicando que puedes hacer esto.

sólo estoy tratando de evitar tener que escribir un montón de

[self removeObserver:self forKeyPath ...] 

en mi método -dealloc.

Respuesta

4

Probablemente podría escapar sin eliminar self como observador, pero no debería. Donde lo haga addObserver:... también tiene que hacer removeObserver:... después.

Pero esta discusión es irrelevante de todos modos, porque no hay necesidad de observar self, solo active su acción en el establecimiento de su propiedad. Esto lleva a un código más claro y más legible que en realidad funciona mejor.

+3

Gracias por su respuesta. Mi clase tiene miles de propiedades que necesitan activar un evento cuando cualquiera de ellas cambia, así que pensé que usar KVO y los setters @synthesized sería más conveniente que escribir un conjunto de miles de millones. – hyperspasm

+1

En una nota rápida, hay razones legítimas para observar a uno mismo, p. Ej. observar una propiedad de solo lectura de la superclase (por ejemplo, cuando se subclasifica NSNotification). También podría haber actualizaciones KVO que no son activadas por el setter (pero por will/didChangeValueForKey: fuera del setter) –

+0

Otra razón son las propiedades '@ dynamic' en CALayers y Core Data, donde escribir su propio setter rompería el setter automático funcionalidad. –

Cuestiones relacionadas