Note : Ceci a été testé et fonctionne à 100%
Swift
override func viewWillDisappear(animated: Bool){
super.viewWillDisappear(animated)
if self.navigationController!.viewControllers.contains(self) == false //tout autre hiérarchie compare si elle contient ou non self
{
// la vue a été supprimée de la pile de navigation ou de la hiérarchie, le retour est probablement la cause
// cela sera lent avec une grande pile cependant.
NSNotificationCenter.defaultCenter().removeObserver(self)
}
}
ViewController Présenté :
override func viewWillDisappear(animated: Bool){
super.viewWillDisappear(animated)
if self.isBeingDismissed() //contrôleur de vue présenté
{
// supprimer l'observateur ici
NSNotificationCenter.defaultCenter().removeObserver(self)
}
}
Objective-C
Dans la version iOS 6.0 >
, il est préférable de supprimer l'observateur dans la méthode viewWillDisappear
car la méthode viewDidUnload
est obsolète.
[[NSNotificationCenter defaultCenter] removeObserver:observerObjectHere];
Il est souvent préférable de supprimer l'observateur
lorsque la vue a été retirée de la pile de navigation ou de la hiérarchie
.
- (void)viewWillDisappear:(BOOL)animated{
if (![[self.navigationController viewControllers] containsObject: self]) //tout autre hiérarchie compare si elle contient ou non self
{
// la vue a été supprimée de la pile de navigation ou de la hiérarchie, le retour est probablement la cause
// cela sera lent avec une grande pile cependant.
[[NSNotificationCenter defaultCenter] removeObserver:observerObjectHere];
}
}
ViewController Présenté :
- (void)viewWillDisappear:(BOOL)animated{
if ([self isBeingDismissed] == YES) /// contrôleur de vue présenté
{
// supprimer l'observateur ici
[[NSNotificationCenter defaultCenter] removeObserver:observerObjectHere];
}
}
0 votes
J'ai mis cela dans la méthode dealloc.
1 votes
La méthode de désallocation n'a pas été automatiquement créée pour moi lorsque j'ai créé la classe objective c, donc c'est bon pour moi de l'ajouter ?
0 votes
Oui, vous pouvez implémenter
-(void)dealloc
et ensuite ajouterremoveObserser:self
dedans. C'est la manière la plus recommandée de mettreremoveObservers:self
0 votes
Est-il toujours acceptable de mettre la méthode
dealloc
dans iOS 6?2 votes
Oui, il est ok d'utiliser dealloc dans les projets ARC tant que vous n'appelez pas [super dealloc] (vous obtiendrez une erreur de compilateur si vous appelez [super dealloc]). Et oui, vous pouvez certainement mettre votre removeObserver dans dealloc.
0 votes
Dealloc existe toujours, mais ce n'est pas l'endroit pour cela, votre dealloc ne sera jamais appelé en raison des références du notificationcenter à votre objet
0 votes
@mcfedr que proposez-vous lorsque NotificationCenter fait référence à un objet ?
0 votes
@Shamsiddin Cette remarque de ma part est en fait incorrecte. NotificationCentre ne garde pas de références fortes aux objets.