Возникли проблемы с релизами в графическом ядре


Я только начал выпускать в 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 4

2 ответа:

Вам нужно только сделать CGContextRelease(context), Если вы ранее сделали CFRetain(context) или CGContextRetain(context), или если вы сами создали контекст. В вашем примере вы вызываете UIGraphicsBeginImageContextWithOptions(), который обрабатывает создание контекста для вас, таким образом, вызывая CGContextRelease() себя, чрезмерно освобождая его.

Вам нужно уравновесить CGColorSpaceCreateDeviceRGB() либо с a:

CGColorSpaceRelease(baseSpace)

Или a:

if (baseSpace) CFRelease(baseSpace)

Вы не владеете контекстом при использовании UIGraphicsGetCurrentContext. Поэтому вы не должны его отпускать. Если бы вы использовали CGContextRetain() , то вы бы выпустили. Более подробная информация об этом доступна здесь:

Руководство по управлению памятью для Core Foundation

Я настоятельно рекомендую прочитать руководство по программированию Memory Management, чтобы получить представление о том, как оно работает.