2017-08-06 15 views
0

Considérons un scénario lorsqu'un objet s'inscrit dans le centre de notification (supposons ios 8) afin que le centre crée une référence forte à l'objet. Puisque < = le centre ios8 fait une référence forte à l'objet, donc le nombre de coups augmente jusqu'à un. Maintenant, Apple doc dit que nous devons supprimer l'observateur dans dealloc() pour éviter les crashs. Je n'ai pas obtenu deux choses ici:Comment la méthode dealloc est appelée si un objet est un observateur et enregistré au centre de notification?

  1. Comment la méthode dealloc() sera appelée si le centre la retient toujours? Ma compréhension est à moins que le nombre de retenue soit nul dealloc() ne sera pas appelé sur cet objet.
  2. Supposons que dealloc se produise et que nous n'avons pas supprimé l'observateur. Puisque l'objet est déjà désalloué, pourquoi est-ce qu'il plante?

Répondre

2

Le documentation for addObserver contient la note suivante:

Si vos cibles d'applications iOS 9.0 et versions ultérieures ou 10.11 et macOS plus tard, vous n'avez pas besoin de désenregistrer un observateur dans sa méthode de désaffectation. Si votre application cible des versions antérieures, veillez à appeler removeObserver: name: object: avant l'observateur ou tout objet spécifié dans addObserver:selector:name:object: est désalloué.

Cela implique que dans iOS 8, l'observateur est considéré comme une référence unsafe_unretained. Si l'observateur est désalloué sans retirer l'observateur, une tentative de remise ultérieure de la notification entraînera une exception puisque la référence sera à un objet désalloué.

Sous iOS 9 et versions ultérieures, l'observateur est considéré comme une référence weak, NotificationCenter vérifiant la référence pour nil avant d'essayer d'avertir l'observateur. Si vous ciblez iOS 9 ou version ultérieure, vous n'avez pas besoin de supprimer explicitement l'observateur.

Ni une référence unsafe_unretained ni une référence weak n'augmente le nombre de rétention, donc l'enregistrement avec NotificationCenter n'empêchera pas l'observateur d'être désaffecté.