0

私が持っているいくつかのデータの視覚的表現を作成しようとしています。

私が持っている関数は機能し、イメージを完全に(そして非常に迅速に)作成しますが、インストゥルメントの下では、実メモリの使用量が急増し、最終的にアプリがクラッシュします。

関数を 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 で malloc された ivar GLubyte です。cells は、データを取得する元の unsigned char 配列です。

私が言ったように、関数は完全に機能します(画像の作成など...)メモリを大量に使用します。

ああ...この機能は、1秒間に30回以上のようにLOTSと呼ばれます(違いが生じることはわかっています)。

助けてくれてありがとう。

4

1 に答える 1

4

CGImageCreate を使用すると、ドキュメントには次のように書かれています。

戻り値 新しい Quartz ビットマップ画像。CGImageRelease を呼び出して、このオブジェクトを解放する必要があります。

于 2012-09-18T21:28:43.007 に答える