Это неправильно:
dataset = [[NSMutableArray alloc] init]; // WRONG
dataset = [NSKeyedUnarchiver unarchiveObjectWithFile:filename];
Почему?Сначала вы выделяете пустой массив и сохраняете его в переменной экземпляра dataset
.Но в следующей строке вы заменяете пустой массив тем, что возвращает +unarchiveObjectWithFile:
.Почему это проблема?Что ж, если вы прочитаете документы, вы увидите, что он возвращает nil
, если файл не найден.Это означает, что теперь вы заменяете пустой массив на nil
, и все сообщения, которые вы отправляете на dataset
, будут игнорироваться (сообщения на nil беззвучно игнорируются в Objective-C)
Я предполагаю, что вы действительно хотите загрузитьнабор данных из файла, и только если это не удалось, начните с пустого набора данных:
dataset = [NSKeyedUnarchiver unarchiveObjectWithFile:filename];
if (dataset==nil) dataset = [[NSMutableArray alloc] init];
У вас позже появится похожая ошибка:
Dream *dr = [[Dream alloc] init]; // WRONG
dr = [dataset objectAtIndex:index];
Вы создаете объект Dream изатем немедленно замените его чем-нибудь из набора данных.То, что вы на самом деле хотите сделать, это:
Dream *dr;
dr = [dataset objectAtIndex:index];
или короче:
Dream *dr = [dataset objectAtIndex:index];
Опять же, вы можете заменить цикл while на цикл fast-enumeration в стиле:
for (Dream *dr in dataset) {
[dreamlist addObject: dr.dreamname];
}
Наконец, чтобы добраться до точки, я не думаю, что EXC_BAD_ACCESS действительно происходит в main.h.Я предполагаю, что вы используете Xcode 4. Пожалуйста, используйте навигатор потока / стека в правой боковой панели при отладке, чтобы найти фактическую позицию, где происходит ошибка.
Возможно, что ошибка действительно возникает в applicationWillTerminate:
, потому чтовы пытаетесь архивировать dataset
, что, вероятно, nil
, и, вероятно, не разрешено архивировать nil
.