2011-01-04 9 views
1

は、あなたがそうのようCGLayer作成放し、次にCGContextRefリリースに不可能であると表示されるコンテキスト...を取得できませんか?CGContextRef(CGLayerからであるコンテキスト)

CGLayerRef自体(明らかに)を解放すると問題なく動作します。

CGLayerをリリースする直前にCGContextRefをリリースできると思いますが、それはありませんか?また、CGLayerを解放した直後にCGContextRefを解放することもできません。

CGContextRefをリリースすると、アプリケーションがクラッシュします。

CGLayerRef aether = CGLayerCreateWithContext(
    UIGraphicsGetCurrentContext(), CGSizeMake(1024,768), NULL); 
CGContextRef weird = CGLayerGetContext(aether); 

// paths, strokes, filling etc 
// paths, strokes, filling etc 

// try releasing weird here 
CGLayerRelease(aether); 
// or, try releasing weird here 

ここで何が起こっているのですか? CGContextReleaseはCFReleaseとまったく同じであり、いくつかのゼロ点検と同じです。

実際にCGContextRefを手動でリリースしないでください。誰か知っていますか?乾杯。以下ジョエルの壮大な答えについて

CGContextRelease(weird); // impossible, not necessary, doesn't work??? 

は正しいと適切なCGLayerRefを解放していますか?ジョエルは指摘している:
「はい、あなたからそれを取得している機能は、その署名に 『作成』しているので参照してください:ドキュメント/ CoreFoundationのを/」

答えて

5

をあなたはコンテキストがCGLayerGetContextから返される所有していません、それを放つべきではない*。特に、Core Foundationの「Get」機能に関する情報については、http://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html#//apple_ref/doc/writerid/cfGetRuleを参照してください。

*:少なくとも、あなたのサンプルコードではリリースしないでください。最初にそれを保持していれば(CGContextRetain(weird))、CGContextReleaseを持たなければなりません。

+1

はい、それを取得している関数の署名に「作成」が含まれています。 http://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html#//apple_ref/doc/writerid/cfCreateRuleを参照してください。 –

関連する問題