Проблема с памятью при использовании NSData - PullRequest
0 голосов
/ 01 сентября 2009

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

для (int i = 0; i <[modelList count]; i ++) {</p>

    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];

}

1 Ответ

2 голосов
/ 01 сентября 2009

Это ужасно:

[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] //

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

...