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]);
Все они отображают один и тот же адрес памяти.
Работает с вашими пользовательскими шрифтами.