我有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
答案 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
}
警告:执行此操作过多会使设备快速运行内存并导致您的应用被杀死。您可能希望确保使用此技术仅限于创建少量图像。