J'ai une méthode qui crée un retourne une instance d'un CoreGraphics
objet - CGPathRef
.
Lorsque je lance l'application via Analyzer, il se plaint que cette méthode fuit ... c'est vrai, mais c'est délibéré. Je veux transférer la propriété à l'appelant et le laisser nettoyer.
Que puis-je faire pour supprimer cette Analyseur Attention?
- (CGPathRef) createSomePath:(CGPoint)center innerRadius:(CGFloat)innerRadius outerRadius:(CGFloat)outerRadius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle
{
CGMutablePathRef slicePath = CGPathCreateMutable();
....
return slicePath; <--- Analyzer points to this line as a potential leak.
}
Supposons que cela soit possible car de nombreux frameworks renvoient ces objets, ce qui nécessite le nettoyage de l'appelant ...
Merci d'avance !
P.S. J'ai bien peur que cette question ne soit ni dupe ni une réponse correcte nulle part ailleurs ... les 3 réponses en haut de cette page ne sont pas correctes / complètes ... seule la réponse fournie ici par Matthias Bauch "La règle est vraiment la bonne réponse à la question que j'ai posée :) MERCI!
Réponses:
9 pour la réponse № 1Les fonctions CoreFoundation suivent les "Créer une règle". Si la fonction contient un "Créer", elle retourne un objet avec un nombre de références égal à 1.
Malheureusement, votre méthode n'est pas une fonction c.
Vous devriez donc transformer votre méthode Objective-C en une fonction C. Quelque chose comme ça:
CGPathRef CreatePath(CGPoint center, CGFloat innerRadius, CGFloat outerRadius, CGFloat startAngle, CGFloat endAngle) {
// your code here
}
Cela devrait plaire à l'analyseur et fonctionner correctement avec ARC.
Dans une méthode Objective-C, vous pouvez obtenir un comportement similaire en démarrant votre signature de méthode avec new
, alloc
, copy
ou mutableCopy
. Commencer la méthode avec new
correspond probablement mieux à votre cas.
Quelque chose comme cela devrait plaire à l'analyseur, mais je ne suis pas sûr que cela fonctionne correctement avec ARC. Vous devez profiler ceci.
- (CGPathRef)newPath:(CGPoint)center innerRadius:(CGFloat)innerRadius outerRadius:(CGFloat)outerRadius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle {
// your code here
}
0 pour la réponse № 2
Vous devriez pouvoir faire ceci:
#ifndef __clang_analyzer__
CGMutablePathRef slicePath = CGPathCreateMutable();
#endif
Je ne peux pas dire que je le recommande cependant!