4

我正在改进我的 ios cocos2d 游戏的性能。当我注意到一件事时,我正在借助 Instruments 工具检查应用程序的内存分配。[NSBundle mainBundle] 调用声明和持有的 CFString 对象过多。它说,

类别:CFString(不可变)负责调用者:[NSBundle mainBundle]

我的代码中有很多地方我写了以下几行

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

这个 CFString 问题是因为上面的代码,因为我在 pathForResource 方法中给出了一个硬编码的字符串吗?或者这个问题的原因是什么?有人可以帮忙吗?这个 CFString 分配占用了我大约 2Mb 的代码,所以我很担心。

最好的祝福

4

2 回答 2

4

这些 CFString 是由于您的应用程序包中有大量资源。在我的测试中,我发现为捆绑包根目录下的每个文件分配了 1 个 CFString。大概这是某种路径名的缓存。

我目前正在开发一个包含 1,000 个资源的应用程序,这些不可变字符串占用了大约 300K。当我删除它们中的大多数时,我最终得到了大约 20K,其中大约 100 个 CFStrings 用于捆绑中约 80 个资源。

似乎减少这些的答案是将资源放在包中的子目录中。您可以在 Xcode 中使用“文件夹参考”来执行此操作。

例如,您的游戏可能有 1,000 个 PNG。将它们放在项目中名为“Assets”的文件夹中(在磁盘上)。将“Assets”目录拖到 Xcode 中,而不是创建一个组,而是创建一个文件夹引用。

于 2012-02-15T19:17:05.393 回答
1

不,这不是 NSBundle 分配字符串的原因,不,你没有做错任何事。-[NSBundle mainBundle] 实际上分配 2MB 的字符串似乎极不可能,所以我建议您查看其他一些分配堆栈跟踪,看看您是否能找到真正的罪魁祸首。

于 2012-01-25T17:22:49.787 回答