我在从applicationDidFinishLaunching调用的方法中有这个代码。它在模拟器中工作,但在iPhone上崩溃。在此操作中有大约1,600个2KB的mp3文件被复制。如果我尝试多次实例化应用程序,它最终会每次复制更多,直到应用程序最终启动而不会崩溃。我发布了我分配的所有内容。我在iPhone上有大约20GB的磁盘空间。如果我逐步注释掉代码并在iPhone上运行它,那么copyItemAtPath似乎就是嫌疑人。
- (void)createCopyOfAudioFiles:(BOOL)force {
@try {
NSError *error;
NSString *component;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSFileManager *fileManager = [[NSFileManager alloc] init];
NSEnumerator *enumerator = [[[NSBundle mainBundle]pathsForResourcesOfType:@"mp3" inDirectory:nil] objectEnumerator];
while ((component = [enumerator nextObject]) != nil) {
NSArray *temp = [component componentsSeparatedByString:@".app/"];
NSString *file = [NSString stringWithFormat:@"%@", [temp objectAtIndex:1]];
NSString *writableAudioPath = [documentsDirectory stringByAppendingPathComponent:file];
BOOL success = [fileManager fileExistsAtPath:writableAudioPath];
if (success && !force) {
continue;
} else if (success && force) {
success = [fileManager removeItemAtPath:writableAudioPath error:&error];
}
success = [fileManager copyItemAtPath:component toPath:writableAudioPath error:&error];
if (!success) {
@throw [NSException exceptionWithName:[error localizedDescription] reason:[error localizedFailureReason] userInfo:nil];
}
}
[fileManager release];
}
@catch (NSException *exception) {
NSLog(@"%@", exception);
@throw [NSException exceptionWithName:exception.name reason:exception.reason userInfo:nil];
}
@finally {
}
}
答案 0 :(得分:1)
如果应用无法在一定时间内启动,操作系统将会终止您的应用。尝试在后台线程上复制。
答案 1 :(得分:0)
由于您在循环中执行此操作,因此自动释放池可能已填满。手动刷新自动释放池或手动释放内存:
NSData data = [[NSData alloc] initWithContentsOfFile:component];
[data writeToFile:writableAudioPath atomically:NO];
[data release];
答案 2 :(得分:0)
NSFileManager *fileManager = [[NSFileManager alloc] init];
在黑暗中刺伤,但您是否尝试过使用非线程安全版本的NSFileManager:
NSFileManager* filemanager = [NSFileManager defaultManager];
答案 3 :(得分:0)
你可能会被iOS看门狗杀死,任何需要太长时间才能启动的应用都会被终止。尝试使用performSelector:withObject:afterDelay:
调用该方法
以便在退出didFinishLaunching方法后运行。