26

コード内の別のメモリ リークを見つけようとしていますが、CG ラスター データが何であるかを理解できないようです。自動スナップショットを有効にして VM トラッカーを通過すると、CG ラスター データだけが増加するようです。これらも、割り当てが増加することなく着実に増加します。

CG ラスター データが何であるか、またどのように修正するかは完全にはわかりませんが、この時点で、フットプリントの増加により最終的にメモリ エラーとクラッシュが発生するため、良くありません。私は(CoreTextを使用して)独自のテキストレンダリングを行っているので、それと関係があると考えています。私も写真を読み込んでいますか?

以下は、フットプリントのイメージです。 ページの読み込み時に割り当てがピークに達しますが (アプリは画像とテキストを含むページを個別に読み込みます)、ダーティ メモリは常に増加します。

更新: この問題はまだ解決されていませんが、興味深いことに、UIFoundations 内の "NSConcreteGlyphGenerator" と呼ばれるものへのリークに関連付けることができます。実際に描画する CoreText メソッドの属性付き文字列で「boundingRectWithSize:」メソッドを呼び出した場合にのみ発生するようです。具体的には、次の行です。

[displayString boundingRectWithSize:CGSizeMake( self.frame.size.width, self.frame.size.height ) options:0 context:nil];

ゆっくりと追跡...

4

6 に答える 6

12

「CG ラスター データ」に含まれている可能性のあるすべてのことはわかりませんが、含まれていることは確かです... ラスター データ (別名ビットマップ) を格納するために Core Graphics によって割り当てられたメモリです。

具体的には、私のアプリでは、CGBitmapContextCreate. Core Graphics がビットマップ メモリを割り当てるようにNULL、パラメーターとして渡します。dataピクセルあたり 32 ビット (4 バイト) の 256x256 ビットマップは、256 KiB = それぞれ 4 KiB の 64 ページを必要とします。Instruments では、それぞれ 65 ページの 2 つの「CG ラスター データ」ブロックを取得します。これらのビットマップ コンテキストの 1 つをコメント アウトすると、Instruments に 65 ページの「CG ラスター データ」ブロックが 1 つだけ表示されます。

一方CATiledLayerで、アプリにも があります。は描画用に独自のグラフィックス コンテキストをセットアップします。ウィンドウ サーバー ( iOS 5 ではiOS 6) も直接アクセスするCATiledLayer共有メモリを使用して、これらのコンテキストを作成すると思います。これらのグラフィック コンテキストに対応する「CG ラスター データ」ブロックが見当たりません。springboardbackboard

于 2012-09-29T04:41:02.677 に答える
1

これは大した答えではありませんが、誰かが調査を開始できるように...

CG Raster Data は iOS 6 で新しくなったと思いますが、iOS 5 では CG Image として存在していました。両方のシミュレーターでテストしたところ、iOS 5 では CG Raster Data は存在しませんでしたが、iOS 6 と iOS 5 の合計量を比較すると、CG Image は CG Raster Data とほぼ同じであり、CG Image は存在しません。 iOS 6に表示されます。したがって、CG ImageをCG Raster Dataに名前を変更したと確信しています。

CG イメージとは何かということについては、私は何ヶ月もそれを理解しようとしてきました。私のアプリにはUIImagesやCG画像が実際にはなく、CG画像のメモリがかなり高いため、システムによって処理されるのはビューレイアウト関連のものであり、実際には制御できないと思います。コア アニメーションとビュー レイアウトを使用します。

于 2012-09-29T03:08:22.423 に答える
0

本当に答えではありません。しかし、CG-raster-data-leak を解決する際に見つけたヒントがいくつかあります。

  • cg-raster-data は CGIMageRefs のメモリを保持します (少なくとも CGBitmapContextCreate(NULL, ...) によって作成されたコンテキストから CGBitmapContextCreateImage() から作成された)
  • 私のリークはCGImageRelease()の欠落でした。画像を使用して CALayer のコンテンツとして渡し、このプロパティが参照を保持していると想定しました。しかし、この割り当てはイメージをコピーしているようです。少なくとも、割り当ての直後に CGImageRelease を呼び出すことに問題はありません。

それが誰かを助けることを願っています...

于 2015-09-09T11:02:44.110 に答える