2011-11-09 1 views
1

Je reçois tout à coup cet avertissement après la mise à niveauObj-C, décrément incorrect du nombre de références d'un objet qui n'appartient pas à ce point à l'appelant?

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

Toutes les idées?

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

} 

Répondre

5

Yep. Vous obtenez un CGColorSpaceRef grâce à la fonction CGColorGetColorSpace. Selon la règle 'Créer/Copier', vous n'avez pas la propriété de cet objet. Vous n'avez donc pas besoin de le libérer, avec CGColorSpaceRelease.

Ne libérez qu'un objet que vous avez explicitement alloué ou copié.

Ceci est valable pour Objective-C, ainsi que pour les classes de style CF.

En Objective-C, cela signifie qu'un appel à alloc ou un appel à copy (et bien sûr un appel explicite à retain) auront besoin d'une version. Avec les classes CF, vous devez libérer si vous avez acquis un objet avec une méthode avec 'create' ou 'copy' dans son nom. Bien sûr, un appel explicite au CFRetain nécessitera également une version.

Pour votre information, il est même dit dans la documentation de la fonction CGColorGetColorSpace, même si la règle « Créer/Copy » est juste clair sur ce point:

Vous êtes responsable de la conservation et de la libérer au besoin .

Signification de l'objet ne persistera pas dans la mémoire si vous ne conservez pas explicitement. Donc, si vous ne le faites pas, vous n'avez pas besoin de le libérer.

Questions connexes