0

我正在尝试创建我拥有的一些数据的可视化表示。

我拥有的功能可以完美地(并且非常快速地)创建图像,但在仪器下,Real Memory 的使用量会飙升并最终导致应用程序崩溃。

我已经用 a 替换了我的函数,return [UIImage imageNamed:@"blah"];并且内存问题完全消失了。

想知道是否有人可以看到内存被占用的原因和位置以及我如何可能再次释放它?

我已经在分配和泄漏工具下运行了工具,但那里没有显示任何内容。

功能是...

- (UIImage*)imageOfMapWithDeadColor:(UIColor *)deadColor aliveColor:(UIColor *)aliveColor
{
//translate colours into rgb components
if ([deadColor isEqual:[UIColor whiteColor]]) {
    dr = dg = db = 255;
} else if ([deadColor isEqual:[UIColor blackColor]]) {
    dr = dg = db = 0;
} else {
    [deadColor getRed:&drf green:&dgf blue:&dbf alpha:&blah];

    dr = drf * 255;
    dg = dgf * 255;
    db = dbf * 255;
}

if ([aliveColor isEqual:[UIColor whiteColor]]) {
    ar = ag = ab = 255;
} else if ([aliveColor isEqual:[UIColor blackColor]]) {
    ar = ag = ab = 0;
} else {
    [aliveColor getRed:&arf green:&agf blue:&abf alpha:&blah];

    ar = arf * 255;
    ag = agf * 255;
    ab = abf * 255;
}

//create bytes of image from the cell map
int yRef, cellRef;

unsigned char *cell_ptr = cells;

for (int y=0; y<self.height; y++)
{
    yRef = y * (self.width * 4);

    int x = 0;
    do
    {
        cellRef = yRef + 4 * x;

        if (*cell_ptr & 0x01) {
            //alive colour
            buffer[cellRef] = ar;
            buffer[cellRef + 1] = ag;
            buffer[cellRef + 2] = ab;
            buffer[cellRef + 3] = 255;
        } else {
            //dead colour
            buffer[cellRef] = dr;
            buffer[cellRef + 1] = dg;
            buffer[cellRef + 2] = db;
            buffer[cellRef + 3] = 255;
        }
        cell_ptr++;
    } while (++x < self.width);
}

//create image
imageRef = CGImageCreate(self.width, self.height, 8, 32, 4 * self.width, CGColorSpaceCreateDeviceRGB(), kCGBitmapByteOrderDefault, provider, NULL, NO, kCGRenderingIntentDefault);

UIImage *image = [UIImage imageWithCGImage:imageRef];

//return image
return image;
}

一些笔记...

buffer 是 init 中的 ivar GLubyte malloc-ed。cells 是我从中获取数据的原始 unsigned char 数组。

就像我说的,这个功能完美地工作(创建图像等......)我只是得到了大量的内存使用。

哦……这个功能被称为 LOTS,比如每秒 30 次或更多(我知道这会有所作为)。

谢谢你的帮助。

4

1 回答 1

4

您使用 CGImageCreate 并且文档说:

返回值 一个新的 Quartz 位图图像。你负责通过调用 CGImageRelease 来释放这个对象。

于 2012-09-18T21:28:43.007 回答