Невозможно освободить 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 для его балансировки.