Возникли проблемы с релизами в графическом ядре
Я только начал выпускать в core graphics, поэтому мне может понадобиться небольшая помощь.
У меня есть код, который выглядит так:
UIImage *buttonImage() {
UIGraphicsBeginImageContextWithOptions(bounds.size, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
CGColorSpaceRef baseSpace = CGColorSpaceCreateDeviceRGB();
CGMutablePathRef outerPath;
CGMutablePathRef midPath;
CGMutablePathRef innerPath;
CGMutablePathRef highlightPath;
//Some button stuff
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CGContextRelease(context);
return image;
}
Эту линию высвобождения я вставил. Я получаю ошибку с ним, хотя:
context_reclaim: invalid context
context_finalize: invalid context
Есть ли какие-либо мысли относительно того, куда я должен поместить освобождение в этом случае?
2 ответа:
Вам нужно только сделать
CGContextRelease(context)
, Если вы ранее сделалиCFRetain(context)
илиCGContextRetain(context)
, или если вы сами создали контекст. В вашем примере вы вызываетеUIGraphicsBeginImageContextWithOptions()
, который обрабатывает создание контекста для вас, таким образом, вызываяCGContextRelease()
себя, чрезмерно освобождая его.Вам нужно уравновесить
CGColorSpaceCreateDeviceRGB()
либо с a:CGColorSpaceRelease(baseSpace)
Или a:
if (baseSpace) CFRelease(baseSpace)
Вы не владеете контекстом при использовании
UIGraphicsGetCurrentContext
. Поэтому вы не должны его отпускать. Если бы вы использовалиCGContextRetain()
, то вы бы выпустили. Более подробная информация об этом доступна здесь:Руководство по управлению памятью для Core Foundation
Я настоятельно рекомендую прочитать руководство по программированиюMemory Management
, чтобы получить представление о том, как оно работает.