Помогите решить проблему с памятью на iOS/iPad

В моем приложении у меня есть куча разных пакетов изображений для загрузки. Изображения загружаются с моего сайта по одному. Пакеты содержат от 100 до 1500 изображений, размер каждого изображения составляет от 100 до 200 КБ.

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

-(BOOL) downloadImageName:(NSString *)imageName ImageGroup:(NSString *)imageGroup AndRow:(int)row {

    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                     NSUserDomainMask, YES);
    NSString *docsPath = [paths objectAtIndex:0];

    NSURL *downloadURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.website.com/%@_0001.jpg",imageName]];
    NSData *data = [NSData dataWithContentsOfURL:downloadURL];
    NSString *savePath = [NSString stringWithFormat:@"%@/%@^%@_%@.jpg",docsPath,currentServerCycle,imageGroup,imageName];
    BOOL downloaded = [data writeToFile:savePath atomically:YES];

    if (downloaded) 
             return YES; 
    }

    else {
    return NO;
    }
}

Проблема у меня вот в чем:

Когда я запускаю это с инструментами производительности, просматривающими распределения, я вижу, что приложение сохраняет mallocs (NSConcreteData) каждый раз, когда загружается изображение, и освобождает их только после завершения основного метода (тот, который вызывает этот метод загрузки). Это нормально для небольших пакетов изображений, но более крупные, очевидно, дают сбой после того, как мои общие выделения достигают примерно 300+ МБ (нормальный объем распределений в моем приложении составляет около 3 МБ).

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

Я попытался вручную выделить и освободить NSData *data, но это не дало результата.


person Brodie    schedule 17.09.2010    source источник


Ответы (1)


Возможно, пул автоосвобождения, в котором находятся объекты, не опустошается до тех пор, пока не вернется основной метод. Вы можете попробовать добавить NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; в начале метода загрузки, затем [слив пула]; прямо перед тем, как вы вернетесь из метода загрузки. Вы должны убедиться, что вы освободили пул, прежде чем вернуться, независимо от того, куда вы вернетесь, иначе вы утечете пул.

Кроме того, согласно стандартному стилю Objective-C, ваш метод должен называться:

  • (BOOL) downloadImageName: (NSString *) imageName imageGroup: (NSString *) imageGroup andRow: (int) row

строчными буквами, чтобы начать имена аргументов "imageGroup:" и "andRow:".

person Andrew Madsen    schedule 17.09.2010
comment
Вот понял спасибо! Я никогда не использовал пул автоматического освобождения для метода, который раньше не планировал использовать в отдельном потоке. И спасибо, что указали на ошибку в названии. - person Brodie; 18.09.2010