Объекты CFString, объявленные [NSBundle mainBundle] - PullRequest
4 голосов
/ 25 января 2012

Я работаю над улучшением производительности моей игры ios cocos2d. Я проверял распределение памяти приложения с помощью инструмента Instruments, когда заметил одну вещь. Слишком много объектов CFString объявлено и удерживается вызовом [NSBundle mainBundle]. Это говорит,

Категория: CFString (неизменяемая) Ответственный абонент: [NSBundle mainBundle]

В моем коде много мест, где я написал следующие строки

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

Это проблема CFString из-за кода выше, потому что я даю жестко закодированную строку в методе pathForResource? Или в чем может быть причина этой проблемы? Может кто-нибудь, пожалуйста, помогите? Это распределение CFString занимает около 2 МБ моего кода, поэтому я беспокоюсь об этом.

С наилучшими пожеланиями

Ответы [ 2 ]

4 голосов
/ 15 февраля 2012

Эти CFString связаны с наличием большого количества ресурсов в вашем комплекте приложений.В моем тестировании я обнаружил 1 CFString, выделенную для каждого файла в корне пакета.Предположительно, это какое-то кэширование имен путей.

В настоящее время я работаю над приложением с тысячами ресурсов в комплекте, и эти неизменяемые строки занимают ~ 300 КБ.Когда я удаляю большинство из них, у меня получается около 20 КБ, в пакете около 100 CFStrings для ~ 80 ресурсов.

Кажется, что ответом на сокращение их является размещение ресурсов в подкаталогахрасслоениеВы можете использовать «Ссылку на папку» в XCode, чтобы сделать это.

Например, у вас может быть 1000 PNG для вашей игры.Поместите их в папку «Активы» в вашем проекте (на диске).Перетащите каталог «Assets» в Xcode и вместо создания группы создайте ссылку на папку.

1 голос
/ 25 января 2012

Нет, это не то, почему NSBundle выделяет строки, и нет, вы там не делаете ничего плохого.Чрезвычайно маловероятно, что - [NSBundle mainBundle] фактически выделяет 2 МБ строк, поэтому я предлагаю вам взглянуть на некоторые другие трассировки стека выделения и посмотреть, сможете ли вы найти настоящего виновника.

...