2011-11-09 6 views
1

は、私は突然Obj-C、この時点で呼び出し元が所有していないオブジェクトの参照カウントが不正確に減少しましたか?

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

} 

答えて

5

イエップ。あなたはCGColorSpaceRefCGColorGetColorSpaceの機能を通して得ています。

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

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

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

これは、Objective-CとCFスタイルクラスで有効です。

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

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

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

あなたの情報については

、それも「を作成/コピー」ルールはこのことについてだけは明らかであったとしても、CGColorGetColorSpace機能のドキュメントで言われています。

意味は、オブジェクトを明示的に保持しないとオブジェクトがメモリに残らないということです。そうしないと、それを解放する必要はありません。

関連する問題