2009-05-21 14 views
5

Sono sicuro che mi manca qualcosa di ovvio qui in un semplice programma iPhone sto cercando di scrivere, ma il codice sembra così semplice che non riesco a vedere cosa c'è che non va.Impossibile impostare setObject: forKey: in NSMutableDictionary

Sto tentando di utilizzare un NSMutableDictionary per memorizzare un elenco di classi e i relativi nomi di file di salvataggio associati. Nel file di intestazione dichiaro dizionario

@interface ClassList : UITableViewController { 
NSString *homedirectory; 
NSString *masterindexpath; 
NSMutableDictionary *classFilenameGlossary; 
NSMutableArray *listofclasses; 
} 

@property (retain, nonatomic) NSString *homedirectory; 
@property (retain, nonatomic) NSString *masterindexpath; 
@property (retain, nonatomic) NSMutableDictionary *classFilenameGlossary; 
@property (retain, nonatomic) NSMutableArray *listofclasses; 

E, naturalmente, nel file di implementazione:

@implementation ClassList 

@synthesize homedirectory; 
@synthesize masterindexpath; 
@synthesize classFilenameGlossary; 
@synthesize listofclasses; 

inizializzo questo dizionario in viewDidLoad da un file esistente che salva il classlist:

- (void)viewDidLoad { 
[super viewDidLoad]; 

// Get home directory 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
homedirectory = [paths objectAtIndex:0]; 
masterindexpath = [homedirectory stringByAppendingPathComponent:@"MasterIndex"]; 

// Get master course list or create it if necessary 

NSFileManager *fm = [NSFileManager defaultManager]; 
if ([fm fileExistsAtPath:masterindexpath] == NO) 
{ 
    NSMutableDictionary *temporarydictionary = [NSMutableDictionary dictionary]; 
    [temporarydictionary writeToFile:masterindexpath atomically:NO]; 
    [temporarydictionary release]; 
} 

[classFilenameGlossary initWithContentsOfFile:masterindexpath]; 

[homedirectory retain]; 
[masterindexpath retain]; 

}

Più tardi, aggiungo un elemento utilizzando setObject: Forkey: ma t il dizionario non cambia mai. Inizialmente lo stavo facendo in un altro controller di visualizzazione utilizzando un puntatore a questo file ClassList, ma una volta scoperto che non funzionava, ho semplificato e provato a impostare qualsiasi oggetto campione e chiave all'interno del file ClassList:

[classFilenameGlossary setObject:@"sample filename" forKey:@"sample classname"]; 

Ho esaminato l'elenco delle variabili del debugger e mostra classFilenameGlossary identificato correttamente come NSMutableDictionary con 0 coppie chiave/valore. Non ricevo alcun tipo di errore; il dizionario semplicemente non cambia mai. Al momento, il dizionario caricato dal file masterindexpath è vuoto (dato che non sono ancora stato in grado di aggiungere altri elementi), ma ciò non dovrebbe impedirmi di aggiungere elementi al dizionario.

Sono un principiante assoluto nella programmazione di iPhone, quindi sono sicuro che ci sia qualcosa di fondamentale che mi manca. Apprezzerei qualsiasi aiuto.

risposta

8

Questa linea:

[classFilenameGlossary initWithContentsOfFile:masterindexpath]; 

dovrebbe assomigliare a questo:

classFilenameGlossary = [[NSMutableDictionary alloc] initWithContentsOfFile:masterindexpath]; 

Si è dimenticato di allocare memoria per il NSMutableDictionary, ecco perché non è mai inizializza.

+0

Grazie, funziona! Sono rimasto bloccato su questo problema per 2 giorni. Ho pensato che dichiarare NSMutableDictionary * classFilenameGlossary nella sezione @interface del file header non fosse necessario, ma ovviamente no. –

+0

@Dan: No. Questo assegna solo spazio per un puntatore a un NSMutableDictionary, non spazio per il dizionario stesso. –

+0

So che è molto tardi per postare, ma per i futuri googler, puoi anche usare semplicemente [dizionario NSMutableDictionaryWithContentsOfFile:] e lo assegna e inizializza automaticamente. – vilhalmer

Problemi correlati