2012-01-25 59 views
4

我正在努力提高我的ios cocos2d遊戲的性能。當我注意到一件事情時,我正在使用Instruments工具檢查應用程序的內存分配情況。有太多的CFString對象被[NSBundle mainBundle]調用聲明和保存。它說,由[NSBundle mainBundle]聲明的CFString對象

類別:CFString字符串(不變) 負責來電:一個NSBundle mainBundle]

有我的代碼中的許多地方,我寫了下面幾行

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

難道這CFString字符串問題是因爲上面的代碼,因爲我在pathForResource方法中給硬編碼的字符串?或者什麼可能是這個問題的原因?任何人都可以幫忙嗎?這個CFString分配需要大約2Mb的代碼,所以我很擔心它。

問候

回答

4

這些CFString是由於您的應用程序包中有大量資源。在我的測試中,我發現爲捆綁的根目錄中的每個文件分配了1個CFString。據推測這是某種路徑名稱的緩存。

我目前正在研究捆綁中有1,000個資源的應用程序,這些不可變的字符串佔用了大約300K。當我刪除它們中的大部分時,我用約20K結束了,大約100個CFStrings用於捆綁約80個資源。

看起來減少這些問題的答案似乎是將資源放入包中的子目錄中。您可以在Xcode中使用「文件夾引用」來執行此操作。

例如,您的遊戲可能有1,000個PNG。把它們放在項目中的一個名爲「Assets」的文件夾中(在磁盤上)。將「Assets」目錄拖到Xcode,而不是創建一個組,創建一個文件夾引用。

+0

嗨Jess謝謝你的回答。請解釋這將如何減少CFString對象的數量? – Aqueel

+0

該包的根目錄中的每個路徑似乎都有1個CFString。減少根目錄中文件的數量會減少CFStrings的數量。 –

+0

謝謝Jess。我肯定會嘗試,並會讓你們知道。再次感謝。您能否確切地說明生成的路徑以及爲什麼不生成子文件夾中的資源? – Aqueel

1

不,這不是爲什麼一個NSBundle被分配字符串,不,你沒有做什麼不對勁的地方。看起來非常不可能的是 - [NSBundle mainBundle]實際上是分配2MB的字符串,所以我建議你看一下其他的分配堆棧跟蹤,看看你是否能找到真正的罪魁禍首。

+0

所以如果有分類:CFString(不可變)和Responsible Caller:[NSBundle mainBundle]那麼這到底意味着什麼呢?因爲這是我在文書中注意到的。 – Aqueel

+0

您是否正在查看(默認摺疊)右側欄中的完整堆棧軌跡,或者只是Instrument在tableview中的最佳猜測? –