J'ai un code d'objectif-C qui ressemble à ce qui suit: Le code est appelé à partir d'une initialisée qui ressemble à ceci: p> Lors de l'exécution de l'analyseur Static Clang, je reçois les avertissements suivants pour la variable code> la variable: P> Fuite potentielle d'un objet alloué à la ligne 41 et stockée dans 'Path' P>
objet avec +0 retenir les comptes retournés à l'appelant où +1 (posséder) retenir le nombre est attendu p>
BlockQuote> Je suis confus. Ma compréhension est que J'ai essayé de modifier
StringByAppingerPathComponent code> devrait renvoyer une chaîne automatique, de sorte qu'il doit em> avoir un nombre net conserver le nombre de 0. (évidemment je ne veux em> Pour le retenir.) P>
copydata: code> pour renvoyer ce qui suit, mais il n'a pas été débarrassé de l'avertissement: P>
return [[path retain] autorelease];
5 Réponses :
Je soupçonne qu'il s'agit simplement de remarquer une méthode avec le préfixe Dans votre cas, bien sûr, vous vous référez aux fichiers et à ce que c'est donc un avertissement ignorable. Si vous modifiez le nom de votre méthode, quelque chose comme copier code> et signalant cela comme quelque chose qui devrait renvoyer quelque chose que l'appelant est propriétaire, car il pense qu'il suit des conventions de nommage de cacao. P>
Savhedata: code> à la place, je parie que l'avertissement disparaîtra. P>
Étant donné que la méthode a le nom Copier code>, l'analyseur s'attend à ce que l'objet renvoyé ait un nombre de retenue +1, en fonction du Guide de gestion de la mémoire . p>
Non, c'est incorrect; Sauf si la méthode contient "Alloc", "Copier", "Nouveau" ou l'un des autres mots-clés qui implique l'objet appartient à l'invocataire, la méthode renvoie un objet modifié ou géré autrement, alors StringByAppendingPathComponent renvoie une chaîne automatique .
En plus de cela, votre méthode "copydata" contient le mot "copie", impliquant que le résultat doit être possédé (et publié) par l'appelant. Cependant, le résultat que vous avez renvoyé a été autoritéé, d'où le message d'erreur qu'il vous donne. Si vous souhaitez réparer l'erreur, ne faites pas d'autorisation. C'est: p> bien sûr, cela implique que les appelants de votre fonction doivent le libérer. Sinon, vous pouvez modifier le nom de votre fonction afin qu'il soit conforme aux directives de gestion de la mémoire. P> Le nom "CopyData", IMHO, n'est pas intuitif. Je vous suggère de renommer votre fonction à "PathtosavedDawithData" ou similaire. Quelque chose qui dit ce qu'il fait réellement. P> p>
Aussi, dans les cas où vous souhaitez vraiment nommer une méthode avec «copie» ou quelque chose que, quelles que soient les directives de gestion de la mémoire cacao, la copie est le meilleur nom de la méthode, vous pouvez annoter la méthode Decrairation avec ns_returns_not_retainé. code> et puis clang ne vous donnera pas un avertissement. Donc:
// Copies data from data to string; does not follow the copy rule
- (NSString*)copyData:(NSData*)data NS_RETURNS_NOT_RETAINED;
Cette réponse vient de supprimer tant d'avertissements incorrects de mon projet!
Je vais faire un coup de poignau à cela et je suppose que vous obtiendriez le même message d'erreur exact, que le nom de votre routine a commencé avec "copie ..." ou non. Je viens de me retrouver dans un scénario similaire et "copie" ne faisait pas partie du nom de la routine que j'appelais. CLANG donnait le message d'erreur simplement parce que je retourne un objet autorélé, une situation dangereuse. Faire le tour à la fin, comme recommandé par Michael s'occupait du problème. P> p>
OMSOPS! Puis-je commenter ma propre réponse? Il s'avère le nom de ma routine commencée par "Nouveau ...", il semble donc que j'étais un peu hâtif. Je sais mieux maintenant. :-)