IOS UIFont кэширование?

Я пытаюсь выяснить, должен ли я кэшировать [UIFont fontWithName: @ "myfont" размер: 24]. Я использую этот шрифт во многих местах. Мне интересно, если iOS уже кэширует это для меня, потому что кеширование шрифтов очень распространено на уровне ОС.

Может кто-нибудь прокомментировать это?

Спасибо.

Ответ 1

В прошлый раз, когда я проверил, системные шрифты были кэшированы (т.е. вызов [UIFont systemFontOfSize:foo] дважды возвращал вам тот же объект). Я не уверен, как часто кеш сбрасывается, но было бы очень глупо не кэшировать шрифты, так как они создаются все время при загрузке nib.

Конечно, если вы делаете это дважды в одной и той же функции, он немного быстрее кэширует его в локальной переменной (и это уменьшает размер кода, поскольку вызовы метода Obj-C огромны!). Если вы делаете это спорадически в разных местах, это может не стоить усилий.

Тем не менее, вы можете получить доступ к шрифту с помощью метода класса или метода на "singleton" (например, [MyAppBranding titleFont] или [[MyAppBranding currentBranding] titleFont]). Это означает, что вы можете значительно изменить используемый шрифт, добавив дополнительный слой кеширования, если вы заметите это узкое место в производительности, и упростит поддержку нескольких брендов.

Ответ 2

Мне интересно, если iOS уже кэширует это для меня, потому что кеширование шрифтов очень распространено на уровне ОС.

что iOS (я тестировал только на iOS 6.1).

Я просто хотел реализовать собственное кэширование. Вы знаете, потому что я умный парень и загрузка шрифта, вероятно, не очень быстро.

Оказывается, люди в Apple тоже умны. Объекты, возвращаемые fontWithName:size:, одинаковы для равных имен шрифтов и равных размеров. Существует механизм кэширования.

Чтобы подтвердить это, я поместил пару NSLogs в приложение.

NSLog(@"GillSans 12 %p", [UIFont fontWithName:@"GillSans" size:12.0f]);

Все они отображают один и тот же адрес памяти.

Работает с вашими пользовательскими шрифтами.