Невозможно освободить CGContextRef (контекст из CGLayer) - PullRequest
1 голос
/ 04 января 2011

Когда вы создаете CGLayer вроде этого, а затем получаете контекст ... кажется невозможным выпустить CGContextRef ?

Выпуск CGLayerRefсамо по себе (очевидно) работает нормально.

Вы могли бы подумать, что можете выпустить CGContextRef непосредственно перед выпуском CGLayer - но нет?Также вы не можете выпустить CGContextRef сразу после выпуска CGLayer.

Если вы отпустите CGContextRef, приложение вылетит.

CGLayerRef aether = CGLayerCreateWithContext(
    UIGraphicsGetCurrentContext(), CGSizeMake(1024,768), NULL);
CGContextRef weird = CGLayerGetContext(aether);

// paths, strokes, filling etc
// paths, strokes, filling etc

// try releasing weird here
CGLayerRelease(aether);
// or, try releasing weird here

Кто-нибудь знает, что здесь происходит?(Обратите внимание, что CGContextRelease действительно точно такой же, как CFRelease, с некоторой проверкой nil.)

На самом деле, не следует ли вам никогда вручную выпускать CGContextRef?Кто-нибудь знает?Приветствия.

CGContextRelease(weird); // impossible, not necessary, doesn't work???

Относительно впечатляющего ответа Джоэла ниже:

Является ли выпуск CGLayerRef правильным и правильным?Джоэл указал:
"Да, поскольку функция, из которой вы ее получаете, имеет подпись" Создать ". См. Документация / CoreFoundation /"

1 Ответ

5 голосов
/ 04 января 2011

Вы не являетесь владельцем контекста, возвращенного из CGLayerGetContext, и поэтому не должны его освобождать *. В частности, см. http://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html#//apple_ref/doc/writerid/cfGetRule для получения информации о функциях «Get» в Core Foundation.

*: по крайней мере, вы не должны выпускать его, учитывая ваш пример кода. Если вы сохранили его вначале (CGContextRetain (странный)), то у вас должен быть CGContextRelease для его балансировки.

...