NSFileManager在app delegate中崩溃

时间:2010-04-28 02:46:44

标签: iphone file crash copy nsfilemanager

我在从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 {

    }
}

4 个答案:

答案 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方法后运行。