In alcune operazioni di manutenzione di alcuni codici "disegno su schermo" multitouch, ho incontrato un bug relativo a come i riferimenti ai tocchi devono essere impostati tra i touchBegan: withEvent :, touchMoved: withEvent: and touchEnded: withEvent :.Come tracciare i tocchi in modo coerente tra i touchBegan: e toccaEnded :?
Il codice utilizza un'istanza NSDictionary per memorizzare i riferimenti di tocchi in touchesBegan: withEvent :, come segue:
for (UITouch *touch in touches]) {
NSValue *touchValue = [NSValue valueWithPointer:touch];
NSString *key = [NSString stringWithFormat:@"%@", touchValue];
[myTouches setValue:squiggle forKey:key];
}
E li recupera in touchesEnded: withEvent: in questo modo:
for (UITouch *touch in touches) {
NSValue *touchValue = [NSValue valueWithPointer:touch];
NSString *key = [NSString stringWithFormat:@"%@", touchValue];
NSObject *valueFromDictionary = [myTouches valueForKey:key];
[myTouches removeObjectForKey:key];
}
In questo ultimo bit di codice, valueFromDictionary capita di essere ogni tanto zero, in quanto la chiave non è conosciuta dal dizionario. Occasionalmente intendo circa l'1% delle volte.
Ora il contesto è impostato, le mie domande sono:
Qualsiasi idea del perché questo codice è bacato? Io non sono sicuro perché non funziona, soprattutto a causa della bassissima frequenza di errori
Some doc from Apple afferma che sia una buona idea quella di utilizzare gli indirizzi degli oggetti come chiavi UITouch
: ma significa usare NSValue * oggetti piuttosto che oggetti NSString * (e di conseguenza utilizzando CFDictionaryRef anziché NSDictionary a causa del fatto che UITouch non implementa il protocollo di copia).Come mai memorizzare una rappresentazione NSString dell'indirizzo anziché lo stesso NSValue non può essere una soluzione facile per poter utilizzare NSDictionary?Aggiornamento: Apple ha aggiornato la pagina e rimosso l'esempio di memorizzare un UITouch tramite un NSString e menziona semplicemente la soluzione CFDictionaryRef non-object-at-all.
ho paura sono lontano da C e puntatori roba e hanno bisogno di aiuto per capire la ragione c'è un bug in questo codice.
Ho provato la soluzione NSValue ma ho avuto lo stesso risultato di NSString: funziona ben il 99% delle volte ma ancora questo 1% di bug. Ora presumo che sia un bug di Apple (il fatto che la pagina che stavo citando nella mia domanda è stata appena aggiornata qualche giorno fa è un altro indizio anche se il personale Apple non è sicuro di questo problema) O un problema di concorrenza tra il momento in cui Inserisco i dati e ottengo i dati. –