J'ai la méthode d'instance suivante (adapté de Listing 3-6 de la section Gestion de l'événement dans le Guide de programmation d'applications iPhone):Comment puis-je libérer() après malloc() lorsque le résultat de malloc() est renvoyé par la fonction?
- (CGPoint)originOfTouch:(UITouch *)touch
{
CGPoint *touchOriginPoint = (CGPoint *)CFDictionaryGetValue(touchOriginPoints, touch);
if (touchOriginPoint == NULL)
{
touchOriginPoint = (CGPoint *)malloc(sizeof(CGPoint)); // leaks
CFDictionarySetValue(touchOriginPoints, touch, touchOriginPoint);
*touchOriginPoint = [touch locationInView:touch.view];
}
return *touchOriginPoint;
}
Chaque fois que dans un certain temps mon application fuites 16 octets par suite de l'appel à malloc()
. Je ne suis pas sûr comment retourner touchOriginPoint
tandis que free()
il aussi bien.
Merci KennyTM, je vais donner à ces fonctions de rappel un coup de feu. –
CFDictionary est requis car UITouch n'implémente pas NSCopying. Lors de l'implémentation de la fonction de rappel, cela n'élimine pas toutes les fuites de mémoire associées. –
@Shaun: Ah c'est vrai. Mais puisque la copie est le seul problème, vous pouvez toujours utiliser 'CFDictionary' avec' UITouch' comme clé, 'NSValue' comme valeurs, et utiliser les callbacks de valeur' & kCFTypeDictionaryValueCallBacks' pour que CF puisse suivre automatiquement le comptage ref. – kennytm