Question

J'utilise des notifications pour transmettre des données à partir d'un contrôleur de vue de détail à l'RootViewController dans mon application. Les méthodes fonctionnent bien jusqu'à ce que il y a un avertissement de mémoire.

La notification est traité deux fois après les mises en mémoire.

Je passe les données au RootViewController lorsque l'utilisateur sélectionne une ligne dans la DetailViewController. La méthode de didSelectRowAtIndexPath est appelé juste une fois, mais l'observateur de notification est appelée deux fois!

Dois-je supprimerons la notification didReceiveMemoryWarning? Ou est-il un autre problème avec le code?

Affichage du code correspondant

viewDidLoad RootViewController

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

didSelectRowAtIndexPath de DetailViewController

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    NSMutableDictionary *dictionary = [[[NSMutableDictionary alloc] init] autorelease];

    [dictionary setObject:selectedRow forKey:@"row"];
    [[NSNotificationCenter defaultCenter] postNotificationName:kSelectionNotificationName object:self userInfo:dictionary];

    [[self navigationController] popToRootViewControllerAnimated:YES];
}

Merci pour toute aide.

Était-ce utile?

La solution

Je suis tout à fait nouveau pour le développement iPhone, mais ce que je remarqué à ce jour est que, après un avertissement de mémoire, l'implémentation par défaut de la méthode didReceiveMemoryWarning est de décharger la vue si ce n'est pas visible.

Je pense que dans votre cas, le contrôleur de vue racine est pas visible, et déchargé à cet effet. Une fois que vous pop au contrôleur de vue racine, la méthode viewDidLoad est appelée à nouveau, et ainsi de l'instance du contrôleur de vue (qui est lui-même pas déchargé, juste la vue est) s'enregistre à nouveau au centre de notification.

La solution serait d'enregistrer dans le centre de notification lors de l'initialisation, étant soit dans le procédé d'initialisation par défaut, ou la méthode initWithNibName:bundle:, ou dans le procédé initWithCoder:.

Autres conseils

Comme vous faites allusion, si vous êtes abonné à une notification deux fois, vous recevrez deux fois.

Très probablement, vous êtes re-instancier un objet désalloué et réabonner à la notification.

Définir un point d'arrêt où vous abonner aux notifications et vous serez très probablement frappé deux fois.

Vous pouvez remplacer l'accesseur et vous désabonner des notifications là. Ou vous pouvez le faire avec KVO.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top