L'information d'observation a été divulguée

J'ai un cours et je l'utilise comme un observateur de lui-même. J'en ai besoin pour m'avertir quand d'autres objects changent ses propriétés. Quand il est désaffecté je ne prends pas la peine d'enlever l'observateur. Cependant, j'ai des erreurs comme celle-ci:

An instance 0xf819680 of class **** was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info: 

Maintenant, je ne comprends pas vraiment pourquoi cela serait un problème. Ma compréhension de KVO est que si l'object A veut observer l'object B alors A retient B puis

 [B addObserver:A]; // shortened just to get the point across 

et B ne conserve PAS A pour éviter un cycle. Par conséquent, si A est désalloué, il doit se retirer en tant qu'observateur de B, sinon B ne disposerait pas d'une reference à l'endroit où A était utilisé (puisqu'il ne retenait PAS A).

Cependant, cet avertissement semble impliquer que si je libère B quelque chose de mauvais se produirait. La seule chose que je puisse imaginer est que la reference faible à A que B aurait disparue et A ne recevrait plus de notifications. Je ne sais pas comment "l'information d'observation a été divulguée." Si B s'en va, pourquoi les informations d'observation qu'il stockait ne disparaissent-elles pas?

En fait, j'ai trouvé la réponse à cette question moi-même. Il semble que lorsque vous libérez B, il ne libère pas les informations d'observation. Cela est dû au fait que KVO est implémenté par catégories (qui ne peuvent pas append de données supplémentaires à l'object lui-même), de sorte que datatables doivent être conservées de manière centralisée par le framework KVO.

Selon la documentation pour addObserver:

 Neither the receiver, nor anObserver, are retained. 

Par conséquent, lorsque vous libérez le framework KVO, vous ne savez pas que le pointeur qu'il a sur B (qu'il utilise pour calculer les notifications) n'est pas valide. Par conséquent, si un autre object se trouve dans le même espace memory, il deviendra l'object observé et enverra potentiellement des notifications indésirables.