Невозможно выпустить cgcontextref (контекст из Clayer)
Вопрос
Когда вы создаете Clayer как так, а затем получить контекст ... кажется, невозможно Выпустите CGContextref?
Выпуск самого Cglayerref (по -видимому) работает нормально.
Вы могли бы подумать, что вы могли бы выпустить CGContextref незадолго до выпуска Clayer - но нет? Вы также не можете выпустить Cgcontextref сразу после освобождения Clayer.
Если вы выпустите 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/»
Решение
Вы не владеете контекстом, возвращенным из CglayergetContext, и поэтому не должны его выпускать*. В частности, см. http://developer.apple.com/library/mac/#documentation/corefoundation/conceptual/cfmemorymgmt/concepts/ownership.html#//apple_ref/doc/writerid/cfgetrule Для получения информации о функциях «получить» в основном фонде.
*: По крайней мере, вы не должны выпускать его, учитывая ваш пример кода. Если вы сохранили его сначала (cgcontextretain (странно)), то у вас должен быть cgcontextrelease, чтобы сбалансировать его.