2011-10-03 2 views
11

[UIFont fontWithName : @ "myfont"size : 24]를 캐시해야하는지 알아 내려고합니다. 나는이 글꼴을 여러 곳에서 재사용하고있다. 글꼴 캐싱이 OS 레벨에서 매우 일반적이기 때문에 iOS가 이미 나를 캐싱하고 있는지 궁금합니다.iOS UIFont 캐싱?

누군가가 이것에 대해 논평 할 수 있습니까?

감사합니다.

답변

18

지난 번에 시스템 글꼴이 캐싱되었습니다 (예 : [UIFont systemFontOfSize:foo]가 동일한 객체를 두 번 반환 함). 캐시가 얼마나 자주 플러시되는지는 잘 모르겠지만 펜촉을로드하는 동안 항상 인스턴스화되므로 글꼴을 캐시하지 않는 것이 매우 어리석은 것처럼 보일 것입니다.

물론 동일한 함수에서 두 번 수행하면 Obj-C 메소드 호출이 크기 때문에 로컬 변수에 캐시하는 것이 약간 빠릅니다 (코드 크기가 줄어 듭니다). 당신이 다른 장소에서 산발적으로 그렇게한다면, 그만한 가치는 없을 것입니다.

그렇다면 클래스 메소드 나 '싱글 톤'방식 (예 : [MyAppBranding titleFont] 또는 [[MyAppBranding currentBranding] titleFont])으로 글꼴에 액세스하고 싶을 수 있습니다. 이는 사용 된 글꼴을 훨씬 쉽게 변경할 수 있음을 의미하며, 성능 병목 현상이있는 경우 캐싱의 추가 레이어를 추가 할 수 있으며 많은 여러 브랜드를 지원하기가 더 쉬워졌습니다.

18

글꼴 캐싱이 OS 레벨에서 매우 일반적이므로 iOS에서이 글꼴을 이미 캐싱하고 있는지 궁금합니다.

iOS (iOS 6.1에서만 테스트 한 것)입니다.

난 그냥 내 자신의 캐싱을 구현하고 싶었어. 내가 똑똑한 사람이고 폰트 로딩이 아마도 그렇게 빠르기 때문에 당신은 알 수 있습니다.

Apple의 사람들은 너무 똑똑합니다. fontWithName:size:에 의해 반환 된 객체는 동일한 fontNames 및 동일한 크기에 대해 동일합니다. 캐싱 메커니즘이 있습니다.

이를 확인하기 위해 앱 전체에 몇 개의 NSLog를 넣었습니다.

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

이들은 모두 동일한 메모리 주소를 표시합니다.

사용자 지정 글꼴에도 사용할 수 있습니다.