0

一部のグラフィックをCGLayersにキャッシュしてから、@ encodeを使用してNSValueオブジェクトに格納しています(配列に格納するため)。保持/解放を正しく処理することを確認したかっただけです...

グラフィックをキャッシュして、次のような配列に保存します。

// Create an NSMutableArray "newCache"
CGLayerRef drawingLayer = CGLayerCreateWithContext(context, bounds.size, NULL);
CGContextRef drawingContext = CGLayerGetContext(drawingLayer);

// Do some drawing...

[newCache addObject:[NSValue valueWithBytes:&drawingLayer objCType:@encode(CGLayerRef)]];
CGLayerRelease(drawingLayer);      // Is this release correct?

そして後で、レイヤーを取得します。

CGLayerRef retrievedLayer;
[(NSValue *)[cacheArray objectAtIndex:index] getValue:&retrievedLayer];

// Use the layer...

// Should I release retrievedLayer here?

配列(最初のコードスニペットの最後の行)に追加された後、レイヤーを解放する必要があると想定するのは正しいですか?コードの前半でcreate関数を呼び出したので、これが当てはまると思いました。NSValueは、レイヤーデータを追跡しますか?使用後にretrieveLayerを手動で解放する必要がありますか?

ありがとう

4

1 に答える 1

1

NSValueはCoreFoundationタイプを認識しないため、CGLayerを保持または解放しません。(@encodedタイプの文字列は、値の大きさを示しているだけで、メモリ管理については何も示していません。)

レイヤーとNSValueの両方が完全に完了するまで、レイヤーを解放しないでください。

または、さらに良いことに、CGLayerをアレイに配置するだけです。すべてのCoreFoundationオブジェクトは、メモリ管理(前述)の目的でNSObjectsと互換性があり、CFオブジェクトをNSArrayに配置したり、その逆を実行したりできるという実用的な効果があります。CGLayersはCFオブジェクトであるため、これは、CGLayerを別のオブジェクトにボックス化せずに配列に配置できることを意味します。

于 2011-08-28T16:23:20.760 に答える