UIImageView.image = mImage泄漏

时间:2011-05-01 08:06:12

标签: iphone memory-leaks uikit uiimageview

我有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 :(得分:0)

使用...

包围您的线程代码
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

//threaded code....

[pool release];

答案 1 :(得分:0)

经典生产者/消费者问题。您的生产者线程可能超越主线程(消费者)。我建议保留一个图像队列(而不是单个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
}

警告:执行此操作过多会使设备快速运行内存并导致您的应用被杀死。您可能希望确保使用此技术仅限于创建少量图像。