L'exemple de code "Traitement d'une séquence multi-touch complexe" dans la section Gestion des événements du Guide de programmation d'application iPhone fournit un exemple incomplet supposant que le lecteur connaît suffisamment les blancs. J'en sais assez pour savoir que je n'en connais pas assez pour le faire sans quelques éclaircissements. Dans la liste 3-6, je suppose que touchBeginPoints
est une propriété membre de type CFDictionaryRef
. Correct?Comment gérer une séquence multi-touch complexe?
Dans le même exemple, nous utilisons malloc()
donc je suppose que nous devons appeler free()
à un moment ultérieur. Ma question est: qu'est-ce que je libère et quand? Dois-je free()
les points individuels dans touchesEnded:
/touchesCancelled:
? Comment ferais-je cela? (Je suppose que j'ai besoin de lire sur l'énumération CFDictionaryRef
) Ou devrais-je free(touchBeginPoints);
dans ma méthode dealloc:
?
Enfin, dans la liste 3-7, il existe une méthode compareAddress:
. Comment (et où) le ferais-je?
Mise à jour Trouvé the answer à la dernière. Oui, touchBeginPoints est une propriété membre de type CFDictionaryRef.
Merci Art. Je suis encore assez fragile sur la gestion de la mémoire. Est-ce que l'appel 'CFDictionaryRemoveValue (touchBeganPoints, touch);' sur chaque touche pendant 'touchEnded:' n'est pas suffisant pour libérer la mémoire que nous avons allouée? –
Oui, si je me souviens bien, toute fonction 'CFDictionary ...' qui supprime une entrée déclenchera le rappel de version pour la clé et la valeur. S'il reste des entrées lorsque le compte de retenue de CFDictionary est décrémenté à zéro via 'CFRelease', les rappels sont appelés pour ces entrées. Pour cette raison, vous devez faire attention en utilisant des types de données qui sont mallocés/libérés avec CFDictionary, car la suppression d'une entrée invalidera les pointeurs que vous pourriez avoir ailleurs. Si ce comportement ne fonctionne pas pour votre conception, vous pouvez simplement passer 'NULL' pour les rappels et gérer le' free' par vous-même. –
Merci encore! (REMBOURRAGE) –