检查目录是否存在时,如何避免EXC_BAD_ACCESS?

时间:2011-07-13 13:14:49

标签: objective-c ios cocoa-touch exc-bad-access nsfilemanager

我正在构建一个应用程序,它将图像缓存在应用程序包的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;

}

在第一次运行应用程序时 - 当没有任何目录存在时 - 应用程序运行,目录按预期创建,一切运行正常。

当应用程序终止并再次运行时,我会在fileExistsAtPath:上的[NSFileManager defaultManager]电话上收到EXC_BAD_ACCESS信号。

我不明白为什么当目录不存在时它会运行得很好,但是当它们存在时它就会失效。

有人可以提供任何帮助吗?

2 个答案:

答案 0 :(得分:40)

你以错误的方式使用检查功能。第二个参数必须是一个指向布尔变量的指针,该函数在调用函数后将被填充:

你正在使用这样的功能:

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

但是应该像这样使用函数:

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

if (isDir) { // file exists and it is directory.

答案 1 :(得分:4)

isDirectory是一个(BOOL *),用于返回描述路径是否指向目录的布尔值。你正在传递一个BOOL。

如果目录存在,它不会崩溃的原因是,如果目录不存在,则不会设置该值。