2009-12-14 5 views
2

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.

Répondre

1
  • Oui, touchBeginPoints est une propriété membre de type CFDictionaryRef.
  • Vous n'appelez pas gratuitement sur une instance de CFDictionaryRef, mais plutôt sur CFRelease. (La gestion de la mémoire de CoreFoundation est similaire à Objective-C avec le comptage explicite des références via la sémantique retenez/relâche.)
  • Vous pouvez lire les "Thèmes de programmation de collection pour Core Foundation" pour avoir une meilleure idée de CFMutableDictionary. Comme pour les touches free, vous souhaiterez probablement passer un rappel de version personnalisée lors de la création du dictionnaire. Le rappel de libération de clé est appelé pour chaque élément du dictionnaire lorsque le dictionnaire lui-même est libéré. (Voir les deux derniers paramètres à CFMutableDictionaryCreate plus.)

compareAddress: ressemblerait à quelque chose comme:

@interface UITouch (TouchSorting) 
- (NSComparisonResult)compareAddress:(id)obj; 
@end 

@implementation UITouch (TouchSorting) 
- (NSComparisonResult)compareAddress:(id)obj { 
    if ((void *)self < (void *)obj) return NSOrderedAscending; 
    else if ((void *)self == (void *)obj) return NSOrderedSame; 
    else return NSOrderedDescending; 
} 
@end 
+0

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

+0

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

+0

Merci encore! (REMBOURRAGE) –

Questions connexes