2010-07-13 6 views
0

Je suis en train d'initialiser un dictionnaire dans viewDidLoad et de l'utiliser pour créer des cellules de vue de table.Iphone: problème de threading?

La première charge fonctionne correctement. Mais dès que je fais défiler la vue de la table pour voir l'élément (pas affiché en bas), l'application se bloque. Grâce au débogueur, j'ai remarqué que l'adresse de l'item du dictionnaire "rootItemsDict" change quand j'ai fait le défilement. Pas capable de comprendre pourquoi c'est. D'après ce que je comprends, l'adresse d'un objet initialisé une fois doit rester la même, au moins dans l'instance de classe donnée. Des pensées?

- (void)viewDidLoad { 
     [super viewDidLoad]; 

      NSString *path = [[NSBundle mainBundle] pathForResource:@"menu" ofType:@"plist"]; 
      rootItemsDict = [NSDictionary dictionaryWithContentsOfFile:path]; 
    } 



    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    NSString *title = (NSString *)[[[rootItemsDict objectForKey:@"rootMenuItems"] objectAtIndex:row] objectForKey:@"heading"]; 

Répondre

2

+dictionaryWithContentsOfFile: renvoie une instance libérée automatiquement. Pour prendre en charge vous devez conserver explicitement:

rootItemsDict = [[NSDictionary dictionaryWithContentsOfFile:path] retain]; 

... ou utilisez le formulaire alloc/init:

rootItemsDict = [[NSDictionary alloc] initWithContentsOfFile:path]; 

... ou si vous avez une déclaration de propriété appropriée (retain) utiliser le poseur:

self.rootItemsDict = [NSDictionary dictionaryWithContentsOfFile:path]; 

Je recommande de lire le Memory Management Programming Guide, en particulier la section sur object ownership.

+0

excellent !!! Merci beaucoup pour votre réponse rapide et le lien !! – user390687