2010-05-17 4 views
0

J'ai un système UINavigation avec une page "bienvenue", une page du milieu et une page de détails. Dans la page du milieu, il y a un contrôleur segmenté qui peut permuter le corps principal de cette page entre une table, un calendrier et un MKMapView, chacun implémenté avec leurs propres classes de contrôleurs de vues.Le contrôleur UIView est mystérieusement désalloué

Aujourd'hui j'ai implémenté MapView et ses annotations et tout ça. C'est bien. Et une description détaillée sur chaque légende vous amène à la page de détail de la même manière que si vous étiez arrivé par la table. Charmant.

J'ai également un bouton de barre de bouton droit qui pousse dans une vue "de recherche". De là, vous pouvez rechercher les données que je suis en train de naviguer. Une fois le filtrage des données (un tableau d'objets que je garde dans un singleton de données), la table recharge ses données et appelle mes méthodes annotation-clearer-and-builder dans la vue de la carte, puis apparaît , donc la page "du milieu" (y compris la vue qui était dans les tripes) est de retour sur l'écran.

Le problème est que si je fais plusieurs allers-retours entre la carte et la recherche plusieurs fois, toute mention de la vue de la table provoque un plantage avec: *** -[CALayer retain]: message sent to deallocated instance 0x710b810. (J'ai évidemment NSZombies allumé.)

J'ai mis un NSLog dans la méthode dealloc de mon contrôleur de vue de table. Cette chose ne s'appelle jamais. Je ne sais pas si nous l'abandonnons dans les coulisses à des fins de mémoire, ou si je fuis et que je ne peux pas remettre mes mains dessus, ou quoi. Je ne sais pas où regarder. Des indices?

EDIT:

Voici le code où j'échange dans les contrôleurs pour la vue principale de mon "milieu" viewController:

- (IBAction)switchView:(id)sender 
{ 
    UISegmentedControl *seg = (UISegmentedControl *)sender; 
    NSInteger choice = [seg selectedSegmentIndex]; 

    NSArray *array = [mainView subviews]; 
    UIView *oldView = [array objectAtIndex:0]; 
    [oldView removeFromSuperview]; 

    if (choice == 0) { 
     if (!self.tableController) 
      self.tableController = [[EventsTableViewController alloc] 
        initWithNibName:@"EventsTableView" bundle:nil]; 
     [mainView addSubview:self.tableController.view]; 
    } 

    if (choice == 1) { 
     if (!self.calendarController) 
      self.calendarController = [[EventsCalendarViewController alloc] 
         initWithNibName:@"EventsCalendarView" bundle:nil]; 
     [mainView addSubview:self.calendarController.view]; 
    } 
    if (choice == 2) { 
     if (!self.mapController) 
      self.mapController = [[EventsMapViewController alloc] 
         initWithNibName:@"EventsMapView" bundle:nil]; 
     [mainView addSubview:self.mapController.view]; 
    } 
} 

par Adam ci-dessous, je fais removeFromSuperview là. J'ai essayé de coller dans une retenue sur oldView juste avant de le retirer, mais cela n'a pas aidé.

Merci!

+0

sera très difficile pour quiconque de vous aider sans un code – Daniel

Répondre

0

Je l'ai trouvé. Sur mon contrôleur de vue de recherche, j'ai passé une référence à UITableView sur la vue précédente, afin que je puisse appeler refreshData après avoir filtré mes données sources.

Je l'ai défini comme une propriété (nonatomic, assign), ce qui semblait correct, mais à l'époque dealloc, je suis allé droit devant et a dit [theTableView release]. C'est en fait la deuxième fois que j'ai des bogues mystérieux et de longue date qui surgissent parce que j'ai sur-publié quelque chose. Je prévois d'apprendre réellement cette fois.

0

Utilisez-vous removeFromSuperview? Soyez conscient qu'il libère ainsi que supprime de superview ...

+1

Hm. Je suis. Et, après avoir fait cela, cela pourrait-il prendre un peu de temps pour qu'il soit vraiment désorganisé? Parce que cela ne se produit réellement qu'après avoir effectué une recherche pour mettre à jour mes données sources, ce qui nécessite un peu de mémoire. En d'autres termes, je supprime de superview, mais la vue persiste jusqu'à la prochaine fois que je fais ma routine de recherche. Est-ce que la publication qui se passe là-bas permet toujours à ma vue de rester et de se désaffecter la prochaine fois que nous aurons besoin de mémoire? –

+0

J'ai modifié ma question pour ajouter le code "swapping main views". –

Questions connexes