Проблема
В вашем коде:
paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
path = [documentsDirectory stringByAppendingPathComponent:@"plist.plist"];
path
содержит путь к файлу с корнем в каталоге документов. Допустим, это …/plist.plist
.
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath: path])
{
path = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat: @"plist.plist"] ];
}
Это странно. Если файл не существует, вы добавляете /plist.plist
к переменной path
, которая становится …/plist.plist/plist.plist
, которая, скорее всего, не существует. Учитывая это,
NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile: path];
-initWithContentsOfFile:
возвращает nil
, поэтому data
равно nil
, поэтому:
int value = 5;
[data setObject:[NSNumber numberWithInt:value] forKey:@"value"];
[data writeToFile: path atomically:YES];
[data release];
ничего не делает и в:
NSMutableDictionary *savedStock = [[NSMutableDictionary alloc] initWithContentsOfFile: path];
int value1;
value1 = [[savedStock objectForKey:@"value"] intValue];
savedStock
также nil
, следовательно, -objectForKey:
, за которым следует -intValue
, возвращает 0.
NSLog(@"%i",value1);
[savedStock release];
Для проверки моего предположения используйте отладчик или NSLog()
для проверки содержимого path
, data
и savedStock
.
Одно решение
Если файл не существует, вы не можете прочитать его. Таким образом:
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath: path])
{
path = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat: @"plist.plist"] ];
}
NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile: path];
должно быть:
NSFileManager *fileManager = [NSFileManager defaultManager];
NSMutableDictionary *data;
if ([fileManager fileExistsAtPath: path])
{
// If the file exists, read dictionary from file
data = [[NSMutableDictionary alloc] initWithContentsOfFile: path];
}
else
{
// If the file doesn’t exist, create an empty dictionary
data = [[NSMutableDictionary alloc] init];
}
и
int value = 5;
[data setObject:[NSNumber numberWithInt:value] forKey:@"value"];
[data writeToFile: path atomically:YES];
[data release];
должен создать …/plist.plist
, содержащий словарь. И:
NSMutableDictionary *savedStock = [[NSMutableDictionary alloc] initWithContentsOfFile: path];
int value1;
value1 = [[savedStock objectForKey:@"value"] intValue];
NSLog(@"%i",value1);
[savedStock release];
должно работать, потому что соответствующий файл был создан на предыдущих шагах.