2011-11-09 1 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

넵. CGColorGetColorSpace 함수를 통해 CGColorSpaceRef이 표시됩니다.

'생성/복사'규칙에 따르면 해당 개체에 대한 소유권이 없습니다.

CGColorSpaceRelease으로 출시 할 필요가 없습니다.

명시 적으로 할당하거나 복사 한 개체 만 릴리스하십시오.

이것은 Objective-C 및 CF 스타일 클래스에 유효합니다.

Objective-C에서는 alloc에 대한 호출 또는 copy (물론 retain에 대한 명시적인 호출)에 대한 호출이 릴리스되어야 함을 의미합니다.

CF 클래스를 사용하면 이름에 'create'또는 'copy'가있는 메소드가있는 객체를 얻은 경우 릴리스해야합니다. 물론 CFRetain에 대한 명시적인 호출에도 릴리스가 필요합니다.

당신은 필요에 따라 유지하고 해제 할 책임이 있습니다 :

당신의 내용

, 심지어 '만들기/복사'규칙이 이것에 대해 단지 분명한 경우에도 CGColorGetColorSpace 함수의 문서에서 말했다 것 .

의미 개체를 명시 적으로 보유하지 않으면 개체가 메모리에 남아 있지 않습니다. 그러지 않으면, 당신은 그것을 풀 필요가 없습니다.

관련 문제