Я создал простой файл plist с некоторыми пользовательскими настройками для карточной игры, которую я пишу. Я также создал контроллер, который читает и записывает в этот файл plist, который является singelton. все работает нормально, но потом после нескольких попыток он перестает работать. Запись значений на консоль показывает список, возвращающий значение 0, из-за которого мое приложение разбивается Я удалил plist и создал новый, а затем тот же рассказ, отлично работает в течение 2 или трех раз, а затем стрела нул ,проблемы с чтением из файла plist
здесь является копией кода контроллера singelton:
@implementation userOptionsController
static userOptionsController* _sharedOptionsController = nil;
@synthesize backgroundSound=_backgroundSound;
@synthesize soundEffects = _soundEffects;
@synthesize coach = _coach;
@synthesize numberOfDecks = _numberOfDecks ;
+(userOptionsController*)sharedOptionsController{
@synchronized([userOptionsController class])
{
if(!_sharedOptionsController)
[[self alloc]init];
return _sharedOptionsController;
}
return nil;
}
+(id)alloc
{
@synchronized ([userOptionsController class])
{
NSAssert(_sharedOptionsController == nil, @"Attempted to allocate a second instance of userOptionsController singleton");
_sharedOptionsController = [super alloc];
return _sharedOptionsController;
}
return nil;
}
- (id) init {
self = [super init];
if (self) {
}
return self;
}
-(void)readPlistFile
{
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"playerPrefOptions.plist"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath: path])
{
NSString *bundle = [[NSBundle mainBundle] pathForResource:@"playerPrefOptions" ofType:@"plist"];
[fileManager copyItemAtPath:bundle toPath: path error:&error];
}
NSMutableDictionary *temp = [[NSMutableDictionary alloc] initWithContentsOfFile: path];
self.backgroundSound = [[temp objectForKey:@"backgroundSounds"]boolValue];
self.soundEffects = [[temp objectForKey:@"soundEffects"]boolValue];
self.coach =[[temp objectForKey:@"coach"]boolValue];
self.numberOfDecks = [[temp objectForKey:@"numberOfDecks"]intValue];
}
-(void)writeOptionsToFile
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"playerPrefOptions.plist"];
NSMutableDictionary *infoDict = [[NSMutableDictionary alloc] initWithContentsOfFile: path];
NSNumber *moshe = [NSNumber numberWithInt:self.numberOfDecks];
[infoDict setObject: moshe forKey:@"numberOfDecks"];
[infoDict setObject:[NSNumber numberWithBool:self.coach] forKey:@"coach"];
[infoDict setObject:[NSNumber numberWithBool:self.backgroundSound] forKey:@"backgroundSounds"];
[infoDict setObject:[NSNumber numberWithBool:self.soundEffects] forKey:@"soundEffects"];
[infoDict writeToFile:path atomically:YES];
}
@end
поэтому свойство:
int numberOfDecks =[userOptionsController sharedOptionsController].numberOfDecks;
вернет ноль.
любые идеи?
спасибо.
Попробуйте удалить '.plist' здесь' stringByAppendingPathComponent: @ "playerPrefOptions.plist"] ' –
Вы уверены, что он не записывает нуль в файл plist? Это может помочь несколько журналов. –
Думаю, вам стоит посмотреть http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Conceptual/UserDefaults/Preferences/Preferences.html и, в частности, основную часть фундамента в http://developer.apple .com/library/ios/# DOCUMENTATION/Cocoa/Conceptual/UserDefaults/AccessingPreferenceValues / AccessingPreferenceValues.html # // apple_ref/doc/uid/10000059i-CH3-97383, который я нашел более простым и надежным в использовании. – markhunte