2009-05-21 12 views
5

Estoy seguro de que me falta algo obvio aquí en un simple programa de iPhone que estoy tratando de escribir, pero el código parece tan básico que no puedo ver lo que está mal.Imposible establecer setObject: forKey: en NSMutableDictionary

Estoy tratando de usar un NSMutableDictionary para almacenar una lista de clases y sus nombres guardados de archivos guardados. En el archivo de cabecera Declaro el diccionario

@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; 

Y, por supuesto, en el archivo de implementación:

@implementation ClassList 

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

Me inicializar este diccionario en viewDidLoad partir de un archivo existente que guarda el 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]; 

}

Posteriormente, agrego un elemento utilizando setObject: forKey: pero t El diccionario nunca cambia. Al principio yo estaba haciendo esto en otro controlador de vista usando un puntero de nuevo a este archivo ClassList, pero una vez que descubrí que no funcionó, he simplificado y trató acaba de establecer cualquier objeto de la muestra y la clave dentro del archivo ClassList:

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

He examinado la lista de variables del depurador y muestra classFilenameGlossary correctamente identificado como NSMutableDictionary con 0 pares de clave/valor. No estoy recibiendo ningún tipo de error; el diccionario simplemente nunca cambia. Por el momento, el diccionario cargado desde el archivo masterindexpath está vacío (ya que aún no he podido agregar ningún elemento), pero eso no debería impedir que agregue elementos al diccionario.

Soy un principiante total en la programación de iPhone, así que estoy seguro de que hay algo básico que me falta. Agradecería cualquier ayuda.

Respuesta

8

Esta línea:

[classFilenameGlossary initWithContentsOfFile:masterindexpath]; 

debería tener este aspecto:

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

Usted se olvidó de asignar memoria para el NSMutableDictionary, así que por eso nunca se inicializa.

+0

¡Gracias, eso funciona! Me he quedado atrapado en ese problema durante 2 días. Pensé que declarar NSMutableDictionary * classFilenameGlossary en la sección @interface del archivo de encabezado hacía que alloc fuera innecesario, pero obviamente no. –

+0

@Dan: No. Eso solo asigna espacio para un puntero a un NSMutableDictionary, no espacio para el diccionario en sí. –

+0

Sé que es muy tarde para publicar, pero para futuros Googlers, también puedes usar [NSMutableDictionary dictionaryWithContentsOfFile:] y automáticamente asigna e inicializa. – vilhalmer

Cuestiones relacionadas