由[NSBundle mainBundle]声明的CFString对象

时间:2012-01-25 13:52:53

标签: iphone objective-c nsbundle cfstring mainbundle

我正在努力提高ios cocos2d游戏的性能。当我注意到一件事时,我正在使用Instruments工具检查应用程序的内存分配。由[NSBundle mainBundle]调用声明和保存的CFString对象太多。它说,

类别:CFString(不可变) 负责的来电者:[NSBundle mainBundle]

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

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

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

最好的问候

2 个答案:

答案 0 :(得分:4)

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

我目前正在开发一个包含1,000个资源的应用程序,这些不可变的字符串占用大约300K。当我删除其中的大部分时,我最终大约有20K,大约有100个CFStrings,大约有80个资源。

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

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

答案 1 :(得分:1)

不,这不是NSBundle分配字符串的原因,不,你在那里做错了什么。看起来非常不可能 - [NSBundle mainBundle]实际上正在分配2MB的字符串,所以我建议你看看其他一些分配栈跟踪,看看你是否能找到真正的罪魁祸首。