1

アップグレード後に突然この警告が表示されます

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);

}
4

1 に答える 1

5

うん。あなたは関数CGColorSpaceRefを通り抜けていCGColorGetColorSpaceます。

「作成/コピー」ルールによると、そのオブジェクトの所有権はありません。

したがって、を使用してリリースする必要はありませんCGColorSpaceRelease

明示的に割り当てまたはコピーしたオブジェクトのみを解放します。

これは、Objective-CおよびCFスタイルのクラスに有効です。

Objective-Cでは、への呼び出しallocまたはへの呼び出しcopy(そしてもちろん明示的なへの呼び出しretain)にはリリースが必要であることを意味します。

CFクラスでは、名前に「create」または「copy」が含まれるメソッドを使用してオブジェクトを取得した場合は、解放する必要があります。もちろん、への明示的な呼び出しにCFRetainもリリースが必要です。

CGColorGetColorSpace参考までに、「作成/コピー」ルールがこれについて明確である場合でも、関数のドキュメントに記載されています。

あなたは必要に応じてそれを保持し、解放する責任があります。

つまり、オブジェクトを明示的に保持しないと、オブジェクトはメモリに保持されません。したがって、そうでない場合は、リリースする必要はありません。

于 2011-11-09T22:11:06.473 に答える