iphone - [NSBundle mainBundle] 声明的 CFString 对象

标签 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 的代码,所以我很担心。

最好的问候

最佳答案

这些 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/

相关文章:

javascript - 预期的不合格 ID cstdlib

swift - 在 Swift 中从 NSBundle 获取文件路径

objective-c - NSBundle 加载一个 NSViewController

objective-c - 如何在应用程序本身内存储 cocoa 应用程序的键值数据?

iPhone模拟器在3.0中不显示错误,但在2.0中显示

ios - UIScrollView 无法滚动?

objective-c - iOS 设备上的 "optimize"类型有意义吗?

objective-c - 调整 NSWindow 大小而不显示调整大小按钮

iphone - 以相反的顺序打印unicode NSString

iphone - 如何使用标签访问 UIButton 并更改其图像?