【发布时间】:2011-10-04 12:03:22
【问题描述】:
我正在构建一个应用程序,它将图像缓存在应用程序包的 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 信号。
我不明白为什么当目录不存在时它运行得很好,但当它们存在时它会崩溃。
谁能提供帮助?
【问题讨论】:
-
你的 NSLog 应该像
NSLog(@"%@", anObject);。如果 anObject 是字符串,则指定NSLog(anObject);有效,因为无论如何都应该在该位置给出格式字符串。因此,它将采用 anObject 作为格式字符串。但它会崩溃,它是字符串以外的其他对象。 -
在
for循环之后尝试retainpaths和documentsPath对象和release它们。
标签: objective-c ios cocoa-touch exc-bad-access nsfilemanager