2010-06-03 9 views
1

Je suis en train de définir le texte des étiquettes avec le contenu de NSMutableString_s qui sont des objets d'un NSMutableDictionray ... le problème que tout fonctionne bien quand je charge la page pour deux fois (donc je pousse, après je pop ...) et avec la troisième poussée le programme ne peut pas lire le contenu de l'un des NSMutableString_s du NSMutableDictionary ... alors quand il se tourne vers l'étape de réglage de la valeur du UILabel qu'il n'a pas trouvé la valeur ...NSMutableDictionary ne peut pas avoir "temps" pour lire des objets (NSMutableString s)

il y a le code où l'exception apparaît:

- (void)viewDidLoad{ 
    [super viewDidLoad]; 
    NSMutableDictionary *item=[days objectAtIndex:0]; 
    NSString *title1=[item objectForKey:@"week_day"]; 
    name1.text=title1; 
    [title1 release]; 
+0

Cette question n'est pas très claire. Que demandez-vous exactement? –

+0

D'où proviennent les données dans le dictionnaire? Si vous allouez à nouveau la vue, les anciennes données seront perdues. S'il vous plaît développez votre question et postez le code ici –

+0

oki j'utilise un UISegmentedController avec lequel je passe entre deux UIViewController (nous les notons 1 & 2). Tout d'abord la vue "1" apparaît avec l'UISegme ... et quand le bandes de l'utilisateur le bouton 2 je pousse la vue "2" ... l'utilisateur veut revenir à "1" il tape le bouton "1" après il revient au "2" .. au "1" ... et quand il tape 2 pour aller plus loin 1 une exception est survenue disant que le programme ne peut pas assigner le texte d'un UILabel et ceci parce que le texte obtenu de NSMutableDictionary n'est pas encore lu (je le découvre lors du débogage) est-il clair ou Je devrais donner le code? –

Répondre

1

Vous ne devriez pas libérer title1 - vous ne possédez pas la chaîne renvoyée par -objectForKey: et vous n'avez pas pris possession de la chaîne en la conservant. Je suggère de lire le Cocoa Memory Management Guide pour empêcher cela dans le futur.

En supposant que text est une retain propriété: avec chaînes transformables, vous devez assigner des copies de la chaîne pour les éviter d'être changé en vous:

NSString *title1 = [[item objectForKey:@"week_day"] copy]; 
name1.text = title1; 
[title1 release]; // copy means taking ownership, so release 

Ce qui suit est un exemple simplifié de ce qui pourrait se produire avec votre code comme affiché:

// entering -viewDidLoad the first time: 
NSString *title1=[item objectForKey:@"week_day"]; 
// lets assume that the strings retain count is 1 here 
name1.text=title1; 
// setter retains, retain count now 2 
[title1 release]; 
// retain count now 1 

// entering -viewDidLoad the second time: 
NSString *title1=[item objectForKey:@"week_day"]; 
// assuming nothing else did retain it, strings retain count is still 1 
name1.text=title1; 
// you assigned the same object, retain count still 1 
[title1 release]; 
// strings retain count now 0 - will be deallocated :(
+0

il y a un lien vers une image qui décrit le bug (quand je débogue) et vous pouvez remarquer que le programme n'a pas assigné de valeur à "title1" http://www.4shared.com/photo/ErtRxLwr/Picture_1 .html et je rappelle que tout a bien fonctionné quand j'ai poussé la vue il y a deux fois –

0

Merci à tous, maintenant il fonctionne très bien quand j'échapper la transition avec des variables intermédiaires, mais ce que je ne l'ai pas compris pourquoi il travaille pour les tw o "pousser" des actions avant !!!

name1.text=[[days objectAtIndex:0] objectForKey:@"week_day"]; 
Questions connexes