Objective c 填充NSMutableArray w/UIImage对象时出现问题
在尝试用UIImage填充NSMutableArray时,我遇到了一个令人困惑的问题Objective c 填充NSMutableArray w/UIImage对象时出现问题,objective-c,iphone,multithreading,uiimage,nsmutablearray,Objective C,Iphone,Multithreading,Uiimage,Nsmutablearray,在尝试用UIImage填充NSMutableArray时,我遇到了一个令人困惑的问题 CGBitmapInfo bitmapInfo = kCGBitmapByteOrderMask; CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); while(...) // <--- It
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderMask;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
while(...) // <--- Iterates through data sets
{
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, data, numBytes, NULL);
CGImageRef cImage = CGImageCreate(iw, ih, 8, 32, 4 * iw, colorSpace, bitmapInfo, provider, NULL, NO, renderingIntent);
UIImage *finalImage = [UIImage imageWithCGImage:cImage];
[images addObject:finalImage]; // <--- Declared and instantiated earlier
[delegate sendImage:finalImage];
CGImageRelease(cImage);
CGDataProviderRelease(provider);
}
CGColorSpaceRelease(colorSpace);
[delegate operationCompletedWithImages:images];
CGBitmapInfo-bitmapInfo=kCGBitmapByteOrderMask;
CGColorRenderingIntent renderingIntent=KCgrenderingEntentDefault;
CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB();
虽然(…)/不确定这是否是问题所在,但您可能应该通知您的代理主线程上的更改,而不是运行NSO操作的线程上的更改
[delegate performSelectorOnMainThread:@selector(sendImage:) withObject:finalImage waitUntilDone:YES];
最后一条信息也是如此。如果委托正在修改任何与UIKit相关的内容,则必须在主线程上调用它 有人可能会假设NSMutableArray将处理添加到其中的对象的内存管理,但可能因为您处理的是C级Quartz helpers/Core wrappers,所以情况可能并非如此
在我试验过的其他图像处理方法中,如果涉及到线程,它们通常被包装在自动释放池中
你在finalImage上尝试过释放/自动释放吗?解决了这个问题。原来是备份数据指针的问题
在此之前,我每次访问数据时都认为它会迭代并用新内容覆盖,新内容会插入我的CGDataProviderRef。事实并非如此,我基本上最终为提供者提供了指向相同备份数据的指针。解决方案是将数据复制到NSData对象中,并将该副本用于数据提供程序
因此,不是:
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, data, numBytes, NULL);
它将是:
NSData *pxData = [[NSData alloc] initWithBytes:pFrameRGB->data length:numBytes];
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)pxData);
非常感谢。这无疑是朝着正确方向迈出的一步。当我在主线程上执行sendImage选择器时,我肯定得到了正确的图像。现在,我将这些图像添加到代理对象(主线程)中的数组中。问题是,一旦它们都被添加了,我试着对它们进行检查,它们都是一样的。很奇怪。所以我从后台线程接收到正确的图像,但不知何故,数组只是存储最后接收到的图像的副本…你说的“所有相同”是什么意思?所有的图片都有相同的内容,还是完全相同的实例?检查存储在数组中的指针值!渲染是相同的。有趣的是,虽然UIImage&CGImageRef指针在数组中是唯一的,但数组中每个UIImage的NSObject->ISA地址都是相同的。我不确定这意味着什么,但这是迄今为止我能找到的唯一联系。我还尝试声明10个UIImage实例变量,并在其中存储一组10个图像。这成功了!因此,问题似乎只出现在将图像存储在数组中时(我尝试了NSArray、CFArray和C array-UIImage*images[…])。我反复修改了保留计数,但没有任何效果。我认为这是在黑暗中拍摄的,因为我不明白为什么它会导致阵列中出现重复的对象。真正让我头晕目眩的是——在委托对象中(在主线程上),我尝试从每个UIImage中提取一个CGImageRef,因为它们是通过sendImage发送的,并在添加到数组之前使用CGImageRef分配一个新UIImage以获得一个新副本。我仍然一遍又一遍地得到相同图像的数组(仍然是添加的最后一个图像)。