Управление памятью в основных графических библиотеках - PullRequest
0 голосов
/ 17 марта 2012

Я немного запутался в том, как обращаться с управлением памятью при работе с графическими библиотеками, особенно с некоторыми CoreText объектами. Например, я хочу создать свойство для CTFontRef, но на самом деле совсем не уверен, как мне его объявить.

1) Должен ли я относиться к этому как к примитиву и делать @property(nonatomic)? Или я не должен объявлять это как собственность вообще?

2) Я предполагаю, что мне нужно сделать CFRelease(myFont) в dealloc, когда я закончу с этим? Как мне правильно его отпустить

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 Ответ

1 голос
/ 17 марта 2012

Базовое управление памятью ядра немного отличается. Вы не создаете свойство с сохранением / копированием для этих объектов.

Когда вы используете создание и копирование с CFObjects, у вас есть CFRelease it. Для сохранения вещей будет метод (например: CGPDFPageRetain (pageRef)) для сохранения.

посмотрите на эту ссылку для более подробной информации.

...