Возникли проблемы с релизами в графическом ядре
Я только начал выпускать в 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, чтобы получить представление о том, как оно работает.