4

iOS cocos2d ゲームのパフォーマンス改善に取り組んでいます。Instrumentsツールを使ってアプリのメモリ割り当てをチェックしていると、あることに気がつきました。[NSBundle mainBundle] 呼び出しによって宣言および保持されている CFString オブジェクトが多すぎます。それは言います、

カテゴリ: CFString (不変) 責任ある呼び出し元: [NSBundle mainBundle]

私のコードには、次の行を書いた場所がたくさんあります

[[NSBundle mainBundle] pathForResource:@"resource-name" ofType:@"png" isDirectory:imageDirectory];

pathForResource メソッドでハードコードされた文字列を指定しているため、この CFString の問題は上記のコードが原因ですか? または、この問題の理由は何ですか? 誰でも助けてもらえますか?この CFString の割り当ては、私のコードの約 2Mb を占めているので、心配しています。

よろしくお願いします

4

2 に答える 2

4

これらの CFString は、アプリケーション バンドルに多数のリソースがあるためです。私のテストでは、バンドルのルートにあるファイルごとに 1 つの CFString が割り当てられていることがわかりました。おそらく、これはある種のパス名のキャッシュです。

私は現在、バンドルに 1,000 のリソースを含むアプリに取り組んでおり、これらの不変の文字列は ~ 300K を占めています。それらの大部分を削除すると、約 20K になり、バンドル内の約 80 個のリソースに対して約 100 個の CFString になります。

これらを減らすための答えは、バンドル内のサブディレクトリにリソースを配置することのようです。これを行うには、Xcode で「フォルダー参照」を使用できます。

たとえば、ゲームに 1,000 個の PNG があるとします。それらをプロジェクト(ディスク上)の「Assets」というフォルダーに入れます。「Assets」ディレクトリを Xcode にドラッグし、グループを作成する代わりに、フォルダー参照を作成します。

于 2012-02-15T19:17:05.393 に答える
1

いいえ、NSBundle が文字列を割り当てているのはそのためではありません。-[NSBundle mainBundle] が実際に 2MB の文字列を割り当てている可能性は非常に低いと思われるので、他の割り当てスタック トレースをいくつか見て、本当の原因を見つけられるかどうかを確認することをお勧めします。

于 2012-01-25T17:22:49.787 に答える