Как я могу избежать EXC_BAD_ACCESS при проверке, существуют ли каталоги? - PullRequest
10 голосов
/ 13 июля 2011

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

В настоящее время я делаю это в didFinishLaunchingWithOptions: примерно так:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    NSArray *directoriesToCreate = [[NSArray alloc] initWithObjects:
                                    @"DirA/DirA1",
                                    @"DirA/DirA2",
                                    @"DirB/DirB2",
                                    @"DirB/DirB2",
                                    @"DirC",
                                    nil];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsPath = [paths objectAtIndex:0];

    for (NSString *directoryToCreate in directoriesToCreate) {

        NSString *directoryPath = [documentsPath stringByAppendingPathComponent:directoryToCreate];
        NSLog(directoryPath);
        if (![[NSFileManager defaultManager] fileExistsAtPath:directoryPath isDirectory:YES]) {

            NSError *directoryCreateError = nil;
            [[NSFileManager defaultManager] createDirectoryAtPath:directoryPath
                                      withIntermediateDirectories:YES
                                                       attributes:nil
                                                            error:&directoryCreateError];


        }

    }

    [window addSubview:navigationController.view];
    [window makeKeyAndVisible];

    return YES;

}

При самом первом запуске приложения, когда ни один из каталогов не существует, приложение запускается, каталоги создаются, как ожидается, и все работает просто отлично.

Когда приложение завершается и запускается снова, я получаю сигнал EXC_BAD_ACCESS при вызове fileExistsAtPath: на [NSFileManager defaultManager].

Чего я не понимаю, так это того, что все работает нормально, когда каталоги не существуют, но падает, когда они существуют.

Может ли кто-нибудь предложить какую-либо помощь?

Ответы [ 2 ]

40 голосов
/ 13 июля 2011

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

Вы используете такую ​​функцию:

[[NSFileManager defaultManager] fileExistsAtPath:directoryPath isDirectory:YES];

Но функция должна использоваться следующим образом:

BOOL isDir;
[[NSFileManager defaultManager] fileExistsAtPath:directoryPath isDirectory:&isDir];

if (isDir) { // file exists and it is directory.
4 голосов
/ 13 июля 2011

isDirectory - это (BOOL *) для возврата логического значения, описывающего, указывает ли путь на каталог. Вы передаете BOOL.

Причина, по которой он не падает, если каталог существует, состоит в том, что значение не устанавливается, если каталог не существует.

...