我正在努力提高我的ios cocos2d游戏的性能。当我在Instruments工具的帮助下检查应用程序的内存分配时,我注意到一件事。NSBundle mainBundle call声明和持有的CFString对象太多。上面写着,
类别: CFString (不可变)负责调用者: NSBundle mainBundle
在我的代码中有很多地方我写了以下几行
[[NSBundle mainBundle] pathForResource:@"resource-name" ofType:@"png" isDirectory:imageDirectory];这个CFString问题是因为上面的代码,因为我在pathForResource方法中给出了一个硬编码的字符串吗?或者这个问题的原因是什么?有人能帮帮忙吗?这种CFString分配占用了我大约2Mb的代码,所以我很担心。
诚挚的问候
发布于 2012-02-16 03:17:05
这些CFString是由于您的应用程序包中有大量资源造成的。在我的测试中,我发现在包的根目录下为每个文件分配了1个CFString。这大概是某种路径名的缓存。
我目前正在开发一个捆绑包中有1000个资源的应用程序,这些不可变的字符串占用了大约300K。当我删除它们中的大多数时,我最终得到了大约20K,捆绑包中大约80个资源的大约100个CFStrings。
似乎减少这些的答案是将Resources放在捆绑包中的子目录中。您可以使用Xcode中的“文件夹引用”来完成此操作。
例如,您的游戏可能有1,000个PNG。将这些文件放在项目中名为"Assets“的文件夹中(磁盘上)。将"Assets“目录拖到Xcode中,创建一个文件夹引用,而不是创建一个Group。
发布于 2012-01-26 01:22:50
不,这不是NSBundle分配字符串的原因,也不是,你没有做错什么。-NSBundle mainBundle实际上分配了2MB的字符串,这似乎非常不可能,所以我建议您查看一些其他的分配堆栈跟踪,看看是否能找到真正的罪魁祸首。
https://stackoverflow.com/questions/9003812
复制相似问题