I am working on performance improvement of my ios cocos2d game. I was checking memory allocations of the app with the help of Instruments tool when I noticed one thing. There are too many CFString objects being declared and held by [NSBundle mainBundle] call. It says,
Category: CFString (immutable) Responsible Caller: [NSBundle mainBundle]
There are many places in my code where I wrote following lines
[[NSBundle mainBundle] pathForResource:@"resource-name" ofType:@"png" isDirectory:imageDirectory];
Is this CFString problem is because of above code because I am giving a hard coded string in pathForResource method? Or what can be reason of this issue? Can anyone please help? This CFString allocations is taking about 2Mb of my code so I am worried about it.
Best Regards
These CFString's are due to having a large number of resources in your application bundle. In my testing I found 1 CFString allocated for each file at the root of the bundle. Presumably this is some kind of caching of path names.
I am currently working on an app with 1,000's of resources in the bundle and these immutable strings are taking up ~ 300K. When I remove the majority of them, I wind up with about 20K, with around 100 CFStrings for ~ 80 resources in the bundle.
It seems like the answer to reducing these is to put Resources in sub-directories within the bundle. You can use a "Folder Reference" in Xcode to do this.
For example, you might have 1,000 PNGs for your game. Put those in a folder called "Assets" in your project (on disk). Drag the "Assets" directory to Xcode and instead of creating a Group, create a Folder Reference.