2010-12-23 1 views
7

J'ai ajouté un observateur dans un UIView personnalisé que j'ai créé sous initWithFrame:.Comment supprimer un observateur pour NSNotification dans un UIView?

[[NSNotificationCenter defaultCenter] addObserver:self 
     selector:@selector(updateZipFromLocation:) 
      name:@"zipFoundFromLocation" 
      object:nil]; 

Le problème est que cette vue est une sous-vue. Lorsque la vue est à nouveau chargée, elle appelle à nouveau le message initWithFrame, ajoutant ainsi deux observateurs et ainsi de suite. Comment puis-je supprimer l'observateur lorsque la vue va disparaître? Comme il s'agit d'un UIView, il est dit que viewWillDisappear:(BOOL)animated n'est pas une méthode valide. Des idées?

+0

Juste un heads-up, KVO se réfère à la valeur clé d'observation, qui est un concept différent de 'NSNotificationCenter'. –

+0

Oups, encore un peu nouveau à tout cela. :) –

Répondre

12

Vous avez dit que initWithFrame: est appelée plus d'une fois, donc je suppose que cela signifie que la vue est détruite et recréée. Vous pouvez supprimer la vue en qualité d'observateur dealloc, qui sera appelée lorsque la vue est plus retenu par personne:

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [super dealloc]; 
} 
+0

Le problème est, dealloc n'est jamais appelé. J'ai mis des déclarations NSLog là et tout. Peut-être que j'ai besoin de supprimer la sous-vue dans mon aperçu, puis dealloc sera appelé. –

+0

@sudo rm -rf Si 'dealloc' n'est pas appelé, mais' initWithFrame: 'est appelé plusieurs fois, cela ressemble à une fuite de mémoire. Assurez-vous de libérer les sous-vues dès que vous n'en avez plus besoin (immédiatement après que 'addSubview:' est généralement approprié). –

+0

J'ai ma sous-vue créée en tant que variable d'instance afin que je puisse y accéder dans d'autres méthodes. Comment dois-je faire avec alors? Le relâcher plante mon application. –

Questions connexes