/ / Supprimer XCode Analyzer Fuite potentielle d'un objet stocké dans une .. erreur [dupliquer] - objective-c, xcode, analyseur

Supprimer XCode Analyzer Fuite potentielle d'un objet stocké dans une erreur .. [duplicate] - objective-c, xcode, analyseur

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 № 1

Les 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!