UIImageView.image = утечка mImage - PullRequest
0 голосов
/ 01 мая 2011

У меня есть цикл thread2, где я делаю сборку (создаю из необработанных байтовых данных) некоторый UIImage в каждой итерации этого цикла

thread2loop()
{
  //make UIIamge here

  [self performSelectorOnMainThread:@selector(setUiImage) withObject:nil waitUntilDone:YES];     
}

, а затем я вызываю метод setUIImage в главном потоке

- (void) setUiImage
{
    self.imageView.image = nil;     
    self.imageView.image = mImage;  
    [mImage release];    
}

это работает, но приложение «Инструменты, утечки» показывает мне, что здесь есть утечки UIImage, и я не знаю, как @ # $!избавиться от этого!(я грустный и немного усталый и скучающий), помогите, что делать, tnx

Ответы [ 2 ]

0 голосов
/ 02 мая 2011

Классическая проблема производителя / потребителя.Ваш поток производителя, вероятно, превосходит основной поток (потребитель).Я бы порекомендовал сохранить очередь изображений (вместо одного mImage) под защитой блокировки, на которую вы ставите изображения (из фоновой очереди), и снимать изображения с вашей основной очереди.Или вы можете использовать GCD, что делает это еще проще.Вместо использования mImage для удержания созданного изображения, вы можете просто использовать блок, который сохранит изображение, а затем установить его в виде изображения в основной очереди.Что-то вроде:

thread2loop() {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    while (...) {
        __block id self_block = self; // (don't want to retain self in the block)
        UIImage *img = [[UIImage alloc] initWithCGImage:quartzImage scale:1.0 orientation:UIImageOrientationUp];

        dispatch_async(dispatch_get_main_queue(), ^{
            block_self.imageView.image = img;  
            [img release];
        }); 
    }
    [pool drain]; // release is outdated for autorelease pools
}

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

0 голосов
/ 01 мая 2011

Окружите свой многопоточный код ...

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

//threaded code....

[pool release];
...