Сбой NSFileManager в делегате приложения

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

    }
}

person user273565    schedule 28.04.2010    source источник


Ответы (4)


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

person bosmacs    schedule 29.03.2011

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

NSData data = [[NSData alloc] initWithContentsOfFile:component];
[data writeToFile:writableAudioPath atomically:NO];
[data release];
person drawnonward    schedule 28.04.2010
comment
Спасибо за ваш ответ. Я согласен с вами и реализовал пул авторелиза. Результаты, к сожалению, были одинаковыми. Затем я заменил copyItemAtPath NSFileManager на writeToFile NSData. Тем не менее, результаты были такими же. Приложение вылетает при загрузке. - person user273565; 29.04.2010

NSFileManager *fileManager = [[NSFileManager alloc] init];

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

NSFileManager* filemanager = [NSFileManager defaultManager];
person jww    schedule 08.03.2011

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

person MCannon    schedule 29.03.2011