Сбой NSFileManager в делегате приложения - PullRequest
0 голосов
/ 28 апреля 2010

У меня есть этот код в методе, вызываемом из applicationDidFinishLaunching. Работает в симуляторе, но вылетает на iPhone. В этой операции копируется около 1600 2KB mp3-файлов. Если я попытаюсь создать экземпляр приложения несколько раз, в конечном итоге оно будет копировать больше, пока приложение не запустится без сбоев. Я выпускаю все, что я выделяю. У меня есть около 20 ГБ свободного места на iPhone. Если я постепенно закомментирую код и запусту его на 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 ]

1 голос
/ 30 марта 2011

ОС убьет ваше приложение, если оно не запустится в течение определенного времени Попробуйте сделать копию в фоновом потоке.

0 голосов
/ 30 марта 2011

Вероятно, вас убивает сторожевой таймер iOS, любое приложение, которое запускается слишком долго, закрывается. попробуйте вызвать метод с performSelector:withObject:afterDelay: чтобы он работал после выхода из метода didFinishLaunching.

0 голосов
/ 08 марта 2011
NSFileManager *fileManager = [[NSFileManager alloc] init];

Удар в темноте, но пытались ли вы использовать не поточно-безопасную версию NSFileManager:

NSFileManager* filemanager = [NSFileManager defaultManager];
0 голосов
/ 28 апреля 2010

Так как вы делаете все это в цикле, пул авто-релиза, вероятно, заполняется. Либо вручную очистите пул автоматического выпуска, либо вручную освободите память:

NSData data = [[NSData alloc] initWithContentsOfFile:component];
[data writeToFile:writableAudioPath atomically:NO];
[data release];
...