2012-03-17 39 views
0

我在處理圖形庫時處理內存管理有些困惑,特別是某些CoreText對象。例如,我想爲CTFontRef創建一個屬性,但實際上我不確定該如何聲明它。核心圖形庫中的內存管理

1)我應該把它當作一個原始的東西嗎?@property(nonatomic)?還是我應該不把它當作財產申報?

2)我認爲我必須在dealloc中執行CFRelease(myFont),當我完成它時?如何正確釋放它

3)在下面的方法中,我是否正確地處理了一些事情? CTFontRef已返回,但不是自動發佈的。我需要擔心這個嗎?

- (CTFontRef) loadCustomFontWithName:(NSString *)fontName ofType:(NSString *)type attributes:(NSDictionary *)attributes 
{ 
    NSString *fontPath = [[NSBundle mainBundle] pathForResource:fontName ofType:type]; 

    NSData *data = [[NSData alloc] initWithContentsOfFile:fontPath]; 
    CGDataProviderRef fontProvider = CGDataProviderCreateWithCFData((CFDataRef)data); 
    [data release]; 

    CGFontRef cgFont = CGFontCreateWithDataProvider(fontProvider); 
    CGDataProviderRelease(fontProvider); 

    CTFontDescriptorRef fontDescriptor = CTFontDescriptorCreateWithAttributes((CFDictionaryRef)attributes); 
    CTFontRef font = CTFontCreateWithGraphicsFont(cgFont, 0, NULL, fontDescriptor); 

    CFRelease(fontDescriptor); 
    CGFontRelease(cgFont); 

    return font; 
} 

總體而言,只是如何看待來自像CoreGraphics中或CoreText底層庫的管理內存,並會很感激,如果有人能告訴我去想它一個很好的方式有點困惑。

回答

1

核心基礎內存管理有點不同。您不要爲這些對象創建保留/複製的屬性。

當你使用CFObject創建和複製時,你有CFRelease它。要保留的東西將有一個方法(例如:CGPDFPageRetain(pageRef))保留。

請參閱this參考瞭解更多詳情。