Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 填充NSMutableArray w/UIImage对象时出现问题_Objective C_Iphone_Multithreading_Uiimage_Nsmutablearray - Fatal编程技术网

Objective c 填充NSMutableArray w/UIImage对象时出现问题

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

在尝试用UIImage填充NSMutableArray时,我遇到了一个令人困惑的问题

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以获得一个新副本。我仍然一遍又一遍地得到相同图像的数组(仍然是添加的最后一个图像)。