Obj-C, Неправильное уменьшение счетчика ссылок на объект, который в данный момент не принадлежит вызывающей стороне? - PullRequest
1 голос
/ 10 ноября 2011

Я внезапно получаю это предупреждение после обновления

Incorrect decrement of the reference count of an object that is not owned at this point by the caller

Есть идеи?

+ (void) drawGradientInRect:(CGRect)rect withColors:(NSArray*)colors{

    NSMutableArray *ar = [NSMutableArray array];
    for(UIColor *c in colors){
        [ar addObject:(id)c.CGColor];
    }


    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);



    CGColorSpaceRef colorSpace = CGColorGetColorSpace([[colors lastObject] CGColor]);
    CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (CFArrayRef)ar, NULL);


    CGContextClipToRect(context, rect);

    CGPoint start = CGPointMake(0.0, 0.0);
    CGPoint end = CGPointMake(0.0, rect.size.height);

    CGContextDrawLinearGradient(context, gradient, start, end, kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);

    CGColorSpaceRelease(colorSpace);  //on this line
    CGGradientRelease(gradient);
    CGContextRestoreGState(context);

}

1 Ответ

5 голосов
/ 10 ноября 2011

Да. Вы получаете CGColorSpaceRef через функцию CGColorGetColorSpace.

Согласно правилу «Создать / Копировать», у вас нет права собственности на этот объект.

Так что вам не нужно выпускать его, с CGColorSpaceRelease.

Выпускать только тот объект, который вы явно выделили или скопировали.

Это действительно для Objective-C, а также для классов стилей CF.

В Objective-C это означает, что вызов alloc или вызов copy (и, конечно, явный вызов retain) потребует освобождения.

С классами CF вам нужно освобождать, если вы приобрели объект с методом с именем 'create' или 'copy' в его имени. Конечно, для явного вызова CFRetain также потребуется выпуск.

К вашему сведению, это даже сказано в документации к функции CGColorGetColorSpace, даже если правило «Создать / Копировать» ясно об этом:

Вы несете ответственность за его сохранение и освобождение по мере необходимости.

Значение объекта не будет сохраняться в памяти, если вы не сохраните его явно. Так что, если вы этого не сделаете, вам не нужно выпускать его.

...