我有一个方法,需要逐个像素地解析一堆大的PNG图像(每个PNG都是600x600像素)。它似乎在模拟器上工作得很好,但在设备(iPad)上,我在一些内存复制功能中得到了一个EXC_BAD_ACCESS。尺寸似乎是罪魁祸首,因为如果我在较小的图像上尝试,一切似乎都正常。下面是与内存相关的下面的方法。
+ (CGRect) getAlphaBoundsForUImage: (UIImage*) image
{
CGImageRef imageRef = [image CGImage];
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *rawData = malloc(height * width * 4);
memset(rawData,0,height * width * 4);
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
CGContextRelease(context);
/* non-memory related stuff */
free(rawData);当我在一堆图像上运行它时,它运行了12次,然后就崩溃了,而在模拟器上它运行起来没有问题。你们有什么想法吗?
发布于 2012-02-26 10:33:42
运行12次,然后崩溃,听起来像是内存不足的问题。这可能是因为CGContext在内部创建了一些大型的自动释放结构。由于您是在循环中执行此操作,它们不会被释放,因此您会耗尽内存并导致死亡。
不过,我不确定Core Foundation如何处理临时对象。我不认为CF对象具有自动释放的等价物,而且核心图形上下文几乎肯定是处理CF对象而不是NSObjects。
为了减少代码中的内存波动,我建议在开始处理之前重构它,创建一次屏幕外的CGContext,并重复使用它来处理每个图像。然后在你完成后释放它。这在任何情况下都会更快(因为您不会在每次循环时都分配巨大的数据结构)。
我敢打赌,这将消除你的崩溃问题,我打赌它也会让你的代码更快,更快。与其他操作相比,内存分配非常慢,而且您需要使用一些非常大的数据结构来处理600x600像素的RGBA图像。
发布于 2012-06-11 23:09:40
转到产品->编辑方案->启用僵尸对象。在启用僵尸对象之前打个记号。现在构建并运行它。它可以给你更好的和点EXC_BAD_ACCES错误的描述。
发布于 2010-04-13 15:32:28
我在使用CGImageCreate()的iPad (当然是iPhoneOS 3.2 )上遇到了类似的崩溃。看到你的困难给了我一个提示。我通过将我的bytesPerRow与2的下一个最大幂对齐来解决了这个问题。
size_t bytesPerRowPower2 = (size_t) round( pow( 2.0, trunc( log((double) bytesPerRow) / log(2.0) ) + 1.0 ) );
如果提供2行对齐功能也能解决您的问题,请让我们知道。您需要使用调整后的大小分配*rawData,并将bytesPerRowPower2传递给CGBitmapContextCreate()...高度似乎不需要对齐。
https://stackoverflow.com/questions/2619224
复制相似问题