UIFont内存问题

字体大小动态变化

在使用UIbutton,UIlabel等控件时,我们经常需要设置字体大小,设置字体就需要用到UIFont类,平时在使用文本字体时,多数情况下是确定的字体,确定的字号,这些情况是没有内存问题的。但是在一些情况下,我们需要动态改变字体大小,比如说,一个frame动态变化的按钮,字体大小需要随着frame的变化而变化。这种情况似乎使用adjustsFontSizeToFitWidth属性比较好,实际上adjustsFontSizeToFitWidth只会让字体缩小,不能变大。


fontWithSize和systemFontOfSize使用注意

 fontWithSize和systemFontOfSize可以设置字体大小,可以在按钮的frame变化的时候,用这两个方法更新字体大小。这两个方法都是新建一个UIFont对象,指定大小后返回。打开UIFont.h,可以找到:

// Some convenience methods to create system fonts

// Think carefully before using these methods. In most cases, a font returned by +preferredFontForTextStyle: will be more appropriate, and will respect the user's selected content size category.

+ (UIFont*)systemFontOfSize:(CGFloat)fontSize;

+ (UIFont*)boldSystemFontOfSize:(CGFloat)fontSize;

+ (UIFont*)italicSystemFontOfSize:(CGFloat)fontSize;

// Create a new font that is identical to the current font except the specified size

- (UIFont*)fontWithSize:(CGFloat)fontSize;

类似于imageNamed,这两种方法也有缓存机制:

You do not create UIFont objects using the alloc and init methods. Instead, you use class methods of UIFont to look up and retrieve the desired font object. These methods check for an existing font object with the specified characteristics and return it if it exists. Otherwise, they create a new font object based on the desired font characteristics.

这就意味着每次设置字体大小的时候,会新建一个UIFont对象,设置字号后返回,而且旧值会缓存起来,以备下次查找使用,在一些动画场景,frame的大小是连续变化的,字号类型是CGFloat,那么可能的值就会有很多种(比如0.0001,0.0002...),这种情况缓存机制就会使内存一直增加。举个例子,在我的程序中,有个滑动页面,页面滑动的时候,导航的字体根据滑动幅度从20变化到40,这样几乎每次滑动页面,内存就会上涨3M,这是非常严重的。

解决方法

解决方法其实就是限制缓存的数量,以20到40为例,分成固定数目的状态,比如20,21,22,..., 40。这样缓存大小就固定了,不会每次滑动就产生新的缓存。

你可能感兴趣的:(UIFont内存问题)