Проблема записи в список - PullRequest
0 голосов
/ 15 июля 2009

Все работает нормально, пока я не вызову метод saveFile (показанный ниже), чтобы записать файл обратно на диск, где он падает. Что я делаю не так?

Это часть моего viewDidLoad метода, в котором я открываю файл, который отлично работает.

//Get The Path
[self initPath];

dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:accountsFilePath];      

if (accountsArray == nil) {
    accountsArray = [[[NSMutableArray alloc]init] autorelease];
}

if (countArray == nil) {     
    countArray = [[[NSMutableArray alloc]init] autorelease];
}

countArray = [dictionary objectForKey:@"count"];
accountsArray = [dictionary objectForKey:@"username"];

Затем я загружаю его в табличное представление. Затем я добавляю в него новые элементы, которые отлично работают. Затем я вызываю этот метод, чтобы сохранить его, и он вылетает:

-(void)saveFile {
    [dictionary setObject:accountsArray forKey:@"username"];
    [dictionary setObject:countArray forKey:@"count"];
    [dictionary writeToFile:accountsFilePath atomically:YES];   
}

Ответы [ 4 ]

1 голос
/ 15 июля 2009

Вы автоматически высвобождаете countArray и accountsArray сразу после их инициализации. Тэт может быть уже освобожден, когда вы попытаетесь спасти их. Попробуйте прокомментировать autorelease для них обоих (и не забудьте выпустить их где-нибудь, может быть, в методе dealloc).

0 голосов
/ 15 июля 2009

// что если путь не найден, файл не загружен и, в свою очередь, словарь равен nil

dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:accountsFilePath];

// при первом создании аккаунтов Array, countArray

if (accountsArray == nil) {
    accountsArray = [[[NSMutableArray alloc]init] autorelease]; }

if (countArray == nil) {     
    countArray = [[[NSMutableArray alloc]init] autorelease]; }

// эй, почему вы снова назначаете accountArray новому, а как насчет старого, который вы только что инициировали?

// если словарь равен нулю, countarray тоже будет равен нулю

countArray = [dictionary objectForKey:@"count"];
accountsArray = [dictionary objectForKey:@"username"];

//// //// ////////////////////////////////////////////////// //////////////

каково ваше сообщение о сбое?

какая у вас учетная запись FilePath

вы можете прочитать файл словаря?

одна вещь, которую вы можете знать

writeToFile не создаст для вас новую папку

поэтому все папки в accountsFilePath должны существовать.

в противном случае вы можете создать эту папку с помощью nsfilemanager

0 голосов
/ 15 июля 2009

Вы, вероятно, уже сделали это, но я бы проверял словарь и accountsFilePath в gdb или используя NSLog прямо перед вызовом writeToFile: atomically:.

Вы также можете поделиться большим окружающим кодом, чтобы показать, что еще происходит в отношении этого словаря.

Я с большим успехом использую NSZombie для отладки случайных сбоев.

0 голосов
/ 15 июля 2009

Все ли ваши переменные находятся в области видимости? Я предполагаю, что accountFilePath и словарь являются переменными класса? Если нет, они могут умереть в конце viewDidLoad.

Еще одна вещь, которая может вас укусить, это то, что емкость вашего словаря слишком мала или что iPhone не нравится, когда вы используете метод setObject для перезаписи пар ключ / значение. Возможно, попробуйте вызвать removeObjectForKey: и затем добавьте его обратно, как описано выше?

...