2

なぜこのリークが発生するのですか?

私は非常に具体的で他の多くの人々を助ける可能性が低い質問をするという考えを非常に嫌いますが、何時間も頭を悩ませた後、私は選択肢がありません。

リーク機器は、次のコードにリークがあることを報告します。

- (void)likeABarrelFullOfHoles
{
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(50.0f, 50.0f), YES, 0.0f);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGLayerRef *shapeLayers = malloc(3 * sizeof(*shapeLayers));

    for (int i = 0; i < 3; i++)
    {
        // Leak culprit.
        shapeLayers[i] = CGLayerCreateWithContext(context, CGSizeMake(5.0f, 5.0f), NULL);
    }

    for (int i = 0; i < 3; i++) {
        free(shapeLayers[i]);
    }
    free(shapeLayers);

    UIGraphicsEndImageContext();
}

具体的には、CGLayerCreateWithContext関数が問題であるが、CGLayerオブジェクトではなくCGContextオブジェクトをリークしていることを報告し、次のように返します。

リーク リーク

私の問題は、メモリ管理/動的割り当ての基本的な理解の欠如によるものであり、次のコードにはリークがないように見えるため、誰かが「このことを知っておく必要があります」という指を振るつもりであることは間違いありません。

- (void)noLeaks
{
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(50.0f, 50.0f), YES, 0.0f);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGLayerRef shapeLayer = CGLayerCreateWithContext(context, CGSizeMake(5.0f, 5.0f), NULL);
    CGLayerRelease(shapeLayer);

    UIGraphicsEndImageContext();
}

これは明らかに、最も単純な再現可能な状態に還元された問題であることに注意してください。実際のコードでは、コンパイル時に配列のサイズがわからないため、動的メモリ割り当てを使用しています。

4

1 に答える 1

2

CGContextインスツルメンツがオブジェクトがリークしていると報告している理由はわかりませんCGLayerが、

shapeLayers[i] = CGLayerCreateWithContext(context, CGSizeMake(5.0f, 5.0f), NULL);

間違いなくリリースする必要があります

CGLayerRelease(shapeLayers[i]); 

ではなく

free(shapeLayers[i]);   

CGLayerCreateWithContextではないmallocため、そのオブジェクトを呼び出すfreeとメモリが破損する可能性があります。

于 2013-03-26T21:01:56.770 に答える