2013-07-09 85 views
1
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:],我運行了泄漏剖析器,並且沒有泄漏。所有加載的字體都保存在堆中,永遠不會被銷燬。請幫我解決這個問題。UIFont fontWithName:居住在堆和

+2

這可能只是一個優化,你永遠不知道這些類是如何實現的,他們可能會處理一種緩存來重用字體。 –

+0

在內存不足警告情況下,系統是否會釋放此內存? – pradeepa

+0

我真的不知道,很難說,我不知道框架是如何實現的。蘋果工程師可能會知道它。 –

回答

3

更有可能的是,系統中的緩存掛在UIFont上,期望它會再次使用。

鑑於它增長一次,永不再次,它不是泄漏。

如果使用Allocations工具中的參考事件跟蹤器,則可以看到保留字體的內容。我敢打賭,你會在UIFont機器的某個地方找到額外的保留。

+0

在內存不足警告情況下,系統是否可以釋放此內存? – pradeepa

+1

@pradeepa也許?如果框架的實施者 - 理解內存壓力問題*真的*確實清楚地認識到刷新所述內存是明智的,則它將被刷新。 – bbum

+0

我再次運行了剖析器並在模擬器上模擬了低內存警告,分配的內存沒有改變。 – pradeepa