Я просто печатал это, когда Ульрих отправил правильный ответ. Остальное я добавлю сюда для дополнительного разъяснения.
Как указал Ульрих, когда у вас нет файла, ваш код просто пропускает инициализацию favoriteJokesDictionary
и favoriteJokes
. Когда вы пытаетесь выписать объект позже, favoriteJokesDictionary
равен нулю, и поэтому метод ничего не делает.
Вы можете просто создать пустой NSMutableDictionary, если файл еще не существует, и, поскольку вы также сохраняете часть словаря в отдельном иваре, вы должны создать его одновременно. Примерно так будет работать:
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* documentsDirectory = [paths objectAtIndex:0];
self.favSaveFilePath = [[NSString alloc] initWithString:[documentsDirectory stringByAppendingPathComponent:@"Favorites.plist"]];
if([fm fileExistsAtPath:favSaveFilePath])
{
favoriteJokesDictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:self.favSaveFilePath];
favoriteJokes = [[NSMutableArray alloc] initWithArray:[self.favoriteJokesDictionary objectForKey:@"FavoriteJokes"]];
} else {
favoriteJokesDictionary = [[NSMutableDictionary alloc] init];
favoriteJokes = [[NSMutableArray alloc] init];
[favoriteJokesDictionary setObject:favoriteJokes forKey:@"JokesArrayKey"];
}
Тем не менее, я думаю, что вы, возможно, могли бы немного упростить свою модель данных там (если не будет происходить намного больше того, что вы не показываете). Если вам нужен словарь, потому что вы храните больше, чем просто шутки, то у вас все в порядке. Однако я бы не стал сохранять массив jokes, потому что если вы позже установите новый объект в массиве для вашего JokesArrayKey, ваш ivar-файл favourite Jokes все равно будет указывать на старый массив.
Я бы просто взял объект из словаря, когда бы он вам не понадобился:
NSMutableArray *jokes = [favoriteJokesDictionary objectForKey:@"JokesArrayKey"];
Еще лучше, если вы немного работаете с массивом jokes, просто извлеките его в свой собственный файл. Вы можете написать NSArray как список, как вы можете с NSDictionary. Если вы используете NSDictionary только как оболочку для записи .plist, вы можете полностью его пропустить.
Еще одна вещь: если ваше свойство favSaveFilePath
помечено как «сохранить», в первом разделе вы обнаружите небольшую утечку памяти. Вы создаете новую сохраненную строку с [[NSString alloc] initWithString:...]
, а затем сохраняете ее снова, присваивая ее свойству. Вы, вероятно, просто хотите:
self.favSaveFilePath = [documentsDirectory stringByAppendingPathComponent:@"Favorites.plist"];