Невозможно освободить CGContextRef (контекст из CGLayer)

Когда вы создаете 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, с некоторой проверкой на ноль.)

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

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

Относительно захватывающего ответа Джоэла ниже:

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

1 ответ

Решение

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

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

Другие вопросы по тегам