Actualizando y guardando datos en plist

Estoy haciendo un juego de iOS y necesito guardar el nivel más alto que ha alcanzado el jugador. Puedo cambiar exitosamente un elemento de datos en una lista, pero por alguna razón, los datos vuelven a su valor original cada vez que se reinicia el juego. Aquí está el flujo básico de mi código:

En el inicio del juego, obtén el nivel más alto que ha alcanzado el jugador (el valor original es 1)

pData = [[PlayerData alloc] init];
currentLevel = [[pData.data valueForKey:@"Highest Level"] intValue];
[self startNewLevel:currentLevel];

'data' es un NSMutableDictionary que se inicializa de esta manera en PlayerData:

self.data = [NSMutableDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"playerdata" ofType:@"plist"]];

más tarde, si el jugador supera el nivel más alto, incremento el valor del "nivel más alto" y escribo en el archivo llamando a esta función en PlayerData:

-(void) newHighestLevel:(NSString*)path :(int)level{
     [self.data setValue:[NSNumber numberWithInt:level] forKey:path];
     [self.data writeToFile:@"playerdata.plist" atomically:YES]

Sé que todo esto funciona porque tengo un menú de nivel al que el jugador puede acceder mientras juega. Cada vez que el jugador presiona el botón de menú de nivel, se crea una subclase de un UITableView que muestra el nivel 1 hasta el nivel más alto alcanzado. La inicialización se ve así:

levelMenu = [[LevelMenu alloc] init:[[pData.data valueForKey:@"Highest Level"] intValue]];

El menú de nivel muestra el número correcto de niveles mientras está en el juego (por ejemplo, si el jugador no ha superado ningún nivel y va al menú de nivel, solo muestra el "nivel 1"; menú de nivel, muestra "nivel 1" y "nivel 2"). Sin embargo, cada vez que la aplicación termina o el usuario sale al menú principal de los juegos, el valor de "nivel más alto" vuelve a 1 y este código:

currentLevel = [[pData.data valueForKey:@"Highest Level"] intValue];

siempre establece currentLevel en 1 cuando el jugador empuja el inicio, sin importar cuántos niveles supere el usuario mientras juega.

¿Por qué el valor está cambiando de nuevo? ¿Me estoy perdiendo algo que haría que mis ediciones plist sean permanentes?

EDITAR:

Aquí está mi nuevo método 'newHighestLevel':

-(void) newHighestLevel:(NSString*)path :(int)level{
    [self.data setValue:[NSNumber numberWithInt:level] forKey:path];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    NSString *docfilePath = [basePath stringByAppendingPathComponent:@"playerdata.plist"];
    [self.data writeToFile:docfilePath atomically:YES];
    self.data = [NSMutableDictionary dictionaryWithContentsOfFile:docfilePath];
    BOOL write = [self.data writeToFile:docfilePath atomically:YES];
}

la escritura se establece en SÍ. Si cambio 'docfilePath' a @ "playerdata.plist", se establece en NO. Nada parece cambiar con el juego en ninguno de los dos casos.

SOLUCIÓN:

-(void) newHighestLevel:(NSString*)path :(int)level{
      [self.data setValue:[NSNumber numberWithInt:level] forKey:path];
      NSString *basePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
      NSString *docfilePath = [basePath stringByAppendingPathComponent:@"playerdata.plist"];
      [self.data writeToFile:docfilePath atomically:YES];
}

y en init

-(id) init{

     NSString *basePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
     NSString *docfilePath = [basePath stringByAppendingPathComponent:@"playerdata.plist"];
     NSFileManager *fileManager = [NSFileManager defaultManager];
     if (![fileManager fileExistsAtPath:docfilePath]){
         NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"playerdata" ofType:@"plist"];
         [fileManager copyItemAtPath:sourcePath toPath:docfilePath error:nil];
     }
     self.data = [NSMutableDictionary dictionaryWithContentsOfFile:docfilePath];
     return self;
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta