我正在改进我的 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。大概这是某种路径名缓存。
我目前正在开发一个 bundle 中包含 1,000 种资源的应用程序,这些不可变字符串占用了大约 300K。当我删除其中的大部分时,我最终得到大约 20K,大约 100 个 CFStrings 用于 bundle 中的 80 个资源。
似乎减少这些的答案是将资源放在包中的子目录中。您可以在 Xcode 中使用“文件夹引用”来执行此操作。
例如,您的游戏可能有 1,000 个 PNG。将它们放在项目(磁盘上)中名为“ Assets ”的文件夹中。将“Assets”目录拖到 Xcode,而不是创建一个组,而是创建一个文件夹引用。
关于iphone - [NSBundle mainBundle] 声明的 CFString 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9003812/