4

コア グラフィックスのリリースを始めたばかりなので、少し助けが必要かもしれません。

次のようなコードがあります。

UIImage *buttonImage() {

UIGraphicsBeginImageContextWithOptions(bounds.size, NO, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();


    CGColorSpaceRef baseSpace = CGColorSpaceCreateDeviceRGB();


    CGMutablePathRef outerPath;
    CGMutablePathRef midPath;
    CGMutablePathRef innerPath;
    CGMutablePathRef highlightPath;

//Some button stuff

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    CGContextRelease(context);

    return image;

}

そのリリースラインを入れました。ただし、エラーが発生します:

context_reclaim: invalid context
context_finalize: invalid context

この場合、リリースをどこに置くべきかについて何か考えはありますか?

4

2 に答える 2

6

CGContextRelease(context)以前にCFRetain(context)またはを実行したことがCGContextRetain(context)ある場合、またはコンテキストを自分で作成した場合にのみ実行する必要があります。あなたの例でUIGraphicsBeginImageContextWithOptions()は、コンテキストの作成を処理している を呼び出しているため、CGContextRelease()自分自身を呼び出すと過剰に解放されます。

CGColorSpaceCreateDeviceRGB()次のいずれかとバランスをとる必要があります。

CGColorSpaceRelease(baseSpace)

または:

if (baseSpace) CFRelease(baseSpace)
于 2012-06-14T02:35:52.243 に答える
6

を使用するときは、コンテキストを所有していませんUIGraphicsGetCurrentContext。したがって、それをリリースするべきではありません。もしあなたが使うならCGContextRetain()、あなたは解放するでしょう。詳細については、次を参照してください。

Core Foundation のメモリ管理ガイド

Memory Managementプログラミングガイドを読んで、それがどのように機能するかを理解することを強くお勧めします.

于 2012-06-14T02:36:01.060 に答える