2013-05-16 123 views
0

我使用分配工具檢查了我的應用程序,發現此處的代碼導致了我的分配問題。該方法返回填充了通過的屬性字符串的平方區域的建議高度;我需要這個,以便計算我需要多大的空間來繪製文本,然後生成書頁:核心文本內存分配問題

- (CGFloat)boundingHeightForWidth:(CGFloat)inWidth ForAttributedString:(NSAttributedString *)attributedString 
{ 
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFMutableAttributedStringRef)attributedString); 
    CGSize suggestedSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0, 0), NULL, CGSizeMake(inWidth, 10000), NULL); 
    CFRelease(framesetter); 
    return suggestedSize.height ; 
} 

因爲我在流動過程中調用這個方法很多,很多時候,我想知道這是怎麼造成高達7MB的內存分配..我認爲釋放frame setter可能夠了,我錯了嗎?

+0

您是否在模擬器上或實際設備上測試了您的內存分配,因爲在模擬器上由Instruments提供的數據不可靠。 – danypata

+0

我在iPhone上測試過。 – Lolloz89

回答

0

我對這個問題做了一些詳細的WRT調試,你可以在我的回答中找到結果this question。有幾件事你可以嘗試。 1,你是否可以在輔助線程中執行這些分配,如果是,那麼將它們移動到主線程會使失去的內存消失?二,你可以堅持到CTFramesetterRef,然後用相同的framesetter反覆調用CTFramesetterSuggestFrameSizeWithConstraints。泄漏似乎在CTFramesetterCreateWithAttributedString()調用中,所以也許你可以通過多次調用該方法來最小化泄漏。

+0

感謝您的測試!我最終發現,分配問題是由於我的應用程序中的一個巨大的保留週期造成的,該應用程序在視圖控制器被釋放時持有生成的頁面。 – Lolloz89