Как я могу избежать EXC_BAD_ACCESS при проверке наличия каталогов?
Я создаю приложение, которое кэширует изображения в папке "Документы" пакета приложений. Чтобы убедиться, что каталоги существуют, я хочу проверить, существуют ли они, и если они этого не делают, создайте их в момент запуска приложения.
В настоящее время я делаю это в 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]
.
Я не понимаю, почему это работает очень хорошо, когда каталоги не существуют, но он падает, когда они существуют.
Может ли кто-нибудь помочь?
Ответы
Ответ 1
Вы используете функцию проверки неправильно. Второй параметр должен быть указателем на булевскую переменную, которая будет заполняться после вызова функции:
Вы используете такую функцию:
[[NSFileManager defaultManager] fileExistsAtPath:directoryPath isDirectory:YES];
Но функция должна использоваться следующим образом:
BOOL isDir;
[[NSFileManager defaultManager] fileExistsAtPath:directoryPath isDirectory:&isDir];
if (isDir) { // file exists and it is directory.
Ответ 2
isDirectory - это (BOOL *) для возврата булевского описания, если путь указывает на каталог. Вы передаете BOOL.
Причина, по которой она не сбой, если каталог существует, заключается в том, что значение не установлено, если каталог не существует.