【问题标题】:UIFont fontWithName: residing on heap and never destroyedUIFont fontWithName:驻留在堆上且永不销毁
【发布时间】:2013-07-07 04:44:03
【问题描述】:
NSMutableArray *fontsDetails=[[NSMutableArray alloc] init];
[fontsDetails addObject:[UIFont systemFontOfSize:28]];

NSArray *fontFamilies = [UIFont familyNames];

for (int i = 0; i < [fontFamilies count]; i++)
{
    NSArray *fontNames = [UIFont fontNamesForFamilyName:[fontFamilies objectAtIndex:i]];
    @autoreleasepool {
        for (NSString *fontName  in fontNames) {
            [fontsDetails addObject:[UIFont fontWithName:fontName size:28]];
        }
    }


}

我在控制器的 viewDidLoad 中使用此代码,使用此代码,第一次和第二次运行之间的堆发射差异增加了 5mb 并且永远不会下降。 (随后的堆射击差异较低)。我在堆射击的回溯中找到 [UIFont fontWithName:],我运行了泄漏分析器并且没有泄漏。所有加载的字体都保存在堆中,永远不会被销毁。请帮我解决这个问题。

【问题讨论】:

  • 这可能只是一种优化,你永远不知道这些类是如何实现的,它们可能会处理一种缓存以重用字体。
  • 如果出现内存不足警告,系统会释放此内存吗?
  • 我真的不知道,很难说,我不知道框架是怎么实现的。可能苹果工程师会知道。

标签: iphone ios objective-c fonts heap-memory


【解决方案1】:

多半是系统中的一个缓存,它挂在 UIFont 上,期望它会被再次使用。

鉴于它只会增长一次,并且不会再增长,因此它不是泄漏。

如果您在分配工具中使用参考事件跟踪器,您可以看到保留字体的原因。我敢打赌,你会在 UIFont 机器的某个地方找到一两个额外的保留。

【讨论】:

  • 如果出现内存不足警告,系统会释放此内存吗?
  • @pradeepa 也许吧?如果框架的实现者——他们真的真的很好地理解内存压力问题——确定刷新所述内存是谨慎的,它将被刷新。
  • 我再次运行分析器并在模拟器上模拟低内存警告,分配的内存没有改变。
  • @pradeepa 然后不要担心,除非你有证据表明它会导致实际问题。请注意,像您一样运行系统上的每种字体似乎有点奇怪。您是否将所有这些都用于某事?如果不是,那似乎浪费了很多时间和空间。
猜你喜欢
  • 2012-05-02
  • 2012-06-20
  • 2015-07-04
  • 2015-11-05
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
相关资源
最近更新 更多