Проблема с памятью при использовании NSData

это мой код, он не освобождает память, он достигает 60 мб, а приложение убивает

for (int i = 0; i ‹[количество списков моделей]; i ++) {

    url=@"http://192.168.0.101/images/projectimages/";
    url=[url stringByAppendingString:[modelList objectAtIndex:i]];
    url=[url stringByAppendingString:@".jpg"];


    [[NSURLCache sharedURLCache] setMemoryCapacity:0];
    [[NSURLCache sharedURLCache] setDiskCapacity:0];




    NSData *imageData=[[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]];

    destinationPath=[documentsDirectory stringByAppendingString:@"/modelimages"];
    destinationPath=[destinationPath stringByAppendingPathComponent:[modelList objectAtIndex:i]];
    destinationPath=[destinationPath stringByAppendingString:@".jpg"];

    [imageData writeToFile:destinationPath atomically:YES];

    [imageData release];
    //imageData=nil;
    //[myurl release];  

    //[imageData release];  

    value=value+divideValue;
    printf("%f\n",value);
    [NSThread detachNewThreadSelector:@selector(updateProgressBar)toTarget:self withObject:nil];

}

person Nirmit Patel    schedule 01.09.2009    source источник
comment
Какое приблизительное значение [количество_моделей]? Сотни или больше?   -  person mahboudz    schedule 01.09.2009
comment
И url, и destinationPath автоматически освобождаются только после того, как эта процедура передает управление циклу выполнения. Однако, если цикл for не повторяется много сотен тысяч раз, эти строки не добавят до 60 МБ. Действительно ли этот код получает изображения и записывает их в ваш каталог документов? Как можно там найти изображения?   -  person mahboudz    schedule 01.09.2009


Ответы (1)


Это ужасно:

[NSThread detachNewThreadSelector:@selector(updateProgressBar)toTarget:self withObject:nil];

Потому что:

  1. создает много потоков.
  2. поскольку я ожидаю, что он обновляет пользовательский интерфейс, при этом он должен обновляться только из основного потока.

Думаю, лучше будет сделать что-нибудь вроде этого:

[self performSelectorOnMainThread:@selector(updateProgressBar) 
                       withObject:nil // or any object you need to pass
                    waitUntilDone:NO] //

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

person Valerii Hiora    schedule 01.09.2009