10
votes

Comment puis-je corriger ce clavier AVERTISSEMENT: "L'objet avec +0 retenir les comptes retournés à l'appelant où +1 (possédant) retenir le nombre est attendu"?

J'ai un code d'objectif-C qui ressemble à ce qui suit: xxx pré>

Le code est appelé à partir d'une initialisée qui ressemble à ceci: p> xxx

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

J'ai essayé de modifier copydata: code> pour renvoyer ce qui suit, mais il n'a pas été débarrassé de l'avertissement: P>

return [[path retain] autorelease];


0 commentaires

5 Réponses :


15
votes

Je soupçonne qu'il s'agit simplement de remarquer une méthode avec le préfixe copier 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.

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 Savhedata: à la place, je parie que l'avertissement disparaîtra.


0 commentaires

4
votes

Étant donné que la méthode a le nom Copier , 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 .


0 commentaires

4
votes

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: xxx

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.

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.


0 commentaires

9
votes

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;


1 commentaires

Cette réponse vient de supprimer tant d'avertissements incorrects de mon projet!



0
votes

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 xxx

à la fin, comme recommandé par Michael s'occupait du problème.


1 commentaires

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. :-)