Ошибка при проверке, существует ли файл - PullRequest
5 голосов
/ 30 августа 2009

Я пытаюсь записать в plist-файл, используя writeToFile, прежде чем писать, я проверяю, существует ли файл.

Это код:

#import "WindowController.h"

@implementation WindowController

@synthesize contacts;

NSString *filePath;
NSFileManager *fileManager;

- (IBAction)addContactAction:(id)sender {

    NSDictionary *dict =[NSDictionary dictionaryWithObjectsAndKeys:
                         [txtFirstName stringValue], @"firstName",
                         [txtLastName stringValue], @"lastName",
                         [txtPhoneNumber stringValue], @"phoneNumber",
                         nil];

    [arrayContacts addObject:dict];

    [self updateFile];
}

- (void)awakeFromNib {
    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    filePath    = [rootPath stringByAppendingPathComponent:@"Contacts.plist"];
    fileManager = [NSFileManager defaultManager];

    contacts = [[NSMutableArray alloc] init];

    if ([fileManager fileExistsAtPath:filePath]) {

        NSMutableArray *contactsFile = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
        for (id contact in contactsFile) {
            [arrayContacts addObject:contact];
        }
    }
}

- (void) updateFile {
    if ( ![fileManager fileExistsAtPath:filePath] || [fileManager isWritableFileAtPath:filePath]) {
        [[arrayContacts arrangedObjects] writeToFile:filePath atomically:YES];
    }
}

@end

Когда выполняется addContactAction, я не получаю никакой ошибки, но программа останавливается и приводит меня к отладчику. Когда я нажимаю продолжить в отладчике, я получаю:

Program received signal:  “EXC_BAD_ACCESS”.

Но это, вероятно, не важно.

PS: я новичок в программировании на Mac, и я не знаю, что еще попробовать, так как я не получаю сообщение об ошибке, которое говорит мне, что происходит не так.

Путь к файлу:

/ Пользователи / Андрэ / Документы / Contacts.plist

Ранее я пробовал это (с тем же результатом), но я читал, что вы можете писать только в папку документов:

/ Пользователи / Андрэ / Desktop / NN / NSTableView / сборки / Debug / NSTableView.app / Содержание / Ресурсы / Contacts.plist

У кого-нибудь есть идея или даже объяснение, почему это происходит?

Ответы [ 2 ]

9 голосов
/ 30 августа 2009

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

[[NSFileManager defaultManager] fileExistsAtPath: filePath];

Тогда, не могли бы вы указать, в какой строке программа работает в отладчике?

2 голосов
/ 30 августа 2009

Вы устанавливаете filePath с помощью метода stringByAppendingPathComponent:. Этот метод возвращает автоматически выпущенный объект. (Автоматически освобожденный объект используется после того, как он был (автоматически) освобожден, что может привести к ошибке неверного доступа.)

Я думаю, что меняется

[rootPath stringByAppendingPathComponent:@"Contacts.plist"];

в

[[rootPath stringByAppendingPathComponent:@"Contacts.plist"] retain];

решит ваши проблемы.

...