我正在改进我的 ios cocos2d 游戏的性能。当我注意到一件事时,我在 Instruments 工具的帮助下检查应用程序的内存分配。 [NSBundle mainBundle] 调用声明和持有太多 CFString 对象。它说,
类别:CFString(不可变)
负责调用者:[NSBundle mainBundle]
我的代码中有很多地方我写了以下几行
[[NSBundle mainBundle] pathForResource:@"resource-name" ofType:@"png" isDirectory:imageDirectory];
这个 CFString 问题是因为上面的代码,因为我在 pathForResource 方法中给出了一个硬编码的字符串吗?或者这个问题的原因是什么?有人可以帮忙吗?这个 CFString 分配占用了我大约 2Mb 的代码,所以我很担心。
此致
最佳答案
这些 CFString 是由于您的应用程序包中有大量资源。在我的测试中,我发现在包的根目录为每个文件分配了 1 个 CFString。据推测,这是对路径名的某种缓存。
我目前正在开发一个包含 1,000 多个资源的应用程序,这些不可变字符串占用了大约 300K。当我删除它们中的大部分时,我最终得到了大约 20K,大约 100 个 CFStrings 用于捆绑中的约 80 个资源。
似乎减少这些的答案是将资源放在包内的子目录中。您可以使用 Xcode 中的“文件夹引用”来执行此操作。
例如,您的游戏可能有 1,000 个 PNG。将它们放在项目(磁盘上)中名为“Assets”的文件夹中。将“Assets”目录拖到 Xcode 中,而不是创建一个组,而是创建一个文件夹引用。
关于iphone - [NSBundle mainBundle] 声明的 CFString 对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9003812/