Объекты CFString, объявленные [NSBundle mainBundle]
Я работаю над улучшением производительности моей игры ios cocos2d. Я проверял распределение памяти приложения с помощью инструмента Instruments, когда заметил одну вещь. Слишком много объектов CFString объявлено и удерживается вызовом [NSBundle mainBundle]. Это говорит,
Категория: CFString (неизменяемый) Ответственный абонент: [NSBundle mainBundle]
В моем коде есть много мест, где я написал следующие строки
[[NSBundle mainBundle] pathForResource:@"resource-name" ofType:@"png" isDirectory:imageDirectory];
Эта проблема CFString из-за кода выше, потому что я даю жестко закодированную строку в методе pathForResource? Или в чем может быть причина этой проблемы? Может кто-нибудь, пожалуйста, помогите? Это распределение CFString занимает около 2 Мб моего кода, поэтому я беспокоюсь об этом.
С уважением
2 ответа
Эти CFString связаны с наличием большого количества ресурсов в вашем комплекте приложений. В моем тестировании я обнаружил 1 CFString, выделенную для каждого файла в корне пакета. Предположительно, это какое-то кеширование путей.
В настоящее время я работаю над приложением с тысячами ресурсов в комплекте, и эти неизменяемые строки занимают ~ 300 КБ. Когда я удаляю большинство из них, у меня получается около 20 КБ, с около 100 CFStrings для ~ 80 ресурсов в комплекте.
Похоже, что ответом на их сокращение является размещение ресурсов в подкаталогах в комплекте. Вы можете использовать "Ссылку на папку" в XCode, чтобы сделать это.
Например, у вас может быть 1000 PNG для вашей игры. Поместите их в папку "Активы" в вашем проекте (на диске). Перетащите каталог "Assets" в Xcode и вместо создания группы создайте ссылку на папку.
Нет, это не то, почему NSBundle выделяет строки, и нет, вы не делаете ничего плохого там. Чрезвычайно маловероятно, что -[NSBundle mainBundle] фактически выделяет 2 МБ строк, поэтому я предлагаю вам взглянуть на некоторые другие трассировки стека выделения и посмотреть, сможете ли вы найти настоящего преступника.