Случайный EXC_BAD_ACCESS на NSUserDefaults доступ или синхронизация - PullRequest
1 голос
/ 29 декабря 2011

В приложении на основе вкладок, когда я переключаюсь между некоторыми вкладками, я иногда получаю EXC_BAD_ACCESS. Это не каждый раз, но если несколько раз пролистать назад и вперед, это произойдет.

Определено в .h:

NSUserDefaults *theData;

У меня есть это в представленииWillAppear и viewWillDisappear:

[theData synchronize];

Строка с ошибкой вызывается в функции на этапе viewWillAppear:

NSMutableArray *thisArray = [theData objectForKey:@"FriendsArray"];

Я использую NSUserDefaults для хранения нескольких словарей данных. Это заполняется серверными вызовами, но нет необходимости во внутренней базе данных из-за ее частого обновления. Я открыт для других способов хранения этих данных, если это будет лучше.

Я пробовал несколько вещей, таких как приведение (NSMutableArray *)[theData objectForKey:@"FriendsArray"]; или использование arrayForKey и ряд других вещей без каких-либо улучшений.

Любая помощь или советы будут с благодарностью.

Ответы [ 3 ]

1 голос
/ 29 декабря 2011
NSMutableArray *thisArray = [theData objectForKey:@"FriendsArray"]; // retain

Неправильно, как вы пытаетесь сделать изменяемый массив.Также написано так, как предлагается в комментариях, вы, вероятно, должны сохранить этот массив.

Попробуйте инициализировать / выделить новый изменяемый массив с такими объектами:

NSMutableArray *thisArray =
 [[NSMutableArray alloc] initWithArray:[theData objectForKey:@"FriendsArray"]];

Другой метод, -(id)initWithArray:(NSArray *)array copyItems:(BOOL)flag;, позволяет сделать копию оригинальных объектов.

0 голосов
/ 22 января 2012

Нет реальной причины для использования

NSUserDefaults *theData;

Вместо этого используйте это для восстановления изменяемого массива из UserDefaults:

NSMutableArray *thisArray =
[[NSUserDefaults standardUserDefaults] objectForKey:@"FriendsArray"] mutableCopy];

Это дает вам RETAINED изменяемый массив.

Обратите внимание, что синхронизировать нужно только при сохранении в UserDefaults, а не при чтении. Вы должны синхронизировать практически после каждого сохранения, так как ваше приложение может аварийно завершить работу или быть закрыто iOS без возможности синхронизации.

0 голосов
/ 29 декабря 2011

Значения в NSUserDefaults не могут быть изменяемыми. Вы пытаетесь преобразовать неизменный объект в изменяемый. Попробуйте преобразовать его в NSArray, затем приведите его обратно в изменяемый массив. Должен исправить вашу проблему.

...