En algún mantenimiento de un código de "dibujo en pantalla" multitáctil, me encontré con un error relativo a cómo las referencias a las instancias de toques deben establecerse entre toquesBegan: conEvent :, toquesMoved: conEvent: y toquesEnded: conEvent :.Cómo rastrear los toques de forma consistente entre los toques BeGo: y toquesEnded :?
El código utiliza un ejemplo NSDictionary para almacenar referencias de toques en touchesBegan: withEvent :, de la siguiente manera:
for (UITouch *touch in touches]) {
NSValue *touchValue = [NSValue valueWithPointer:touch];
NSString *key = [NSString stringWithFormat:@"%@", touchValue];
[myTouches setValue:squiggle forKey:key];
}
y los recupera en touchesEnded: withEvent: de esta manera:
for (UITouch *touch in touches) {
NSValue *touchValue = [NSValue valueWithPointer:touch];
NSString *key = [NSString stringWithFormat:@"%@", touchValue];
NSObject *valueFromDictionary = [myTouches valueForKey:key];
[myTouches removeObjectForKey:key];
}
En este último bit de código, valueFromDictionary pasa a ser ocasionalmente nulo, ya que la clave no es conocida por el diccionario. De vez en cuando, me refiero a aproximadamente el 1% del tiempo.
Ahora el contexto está establecido, mis preguntas son:
Cualquier idea de por qué este código está libre de errores? No estoy seguro de por qué no funciona, especialmente debido a la muy baja frecuencia de los errores
Some doc from Apple afirma que es una buena idea utilizar direcciones de los objetos UITouch como claves
: pero significa el uso de objetos NSValue * en lugar de los objetos NSString * () y, en consecuencia, utilizando CFDictionaryRef en lugar de NSDictionary debido a que UITouch no implementa el protocolo de copiado).¿Por qué almacenar una representación en NSString de la dirección en lugar de la NSValue en sí misma no puede ser una solución fácil para poder usar NSDictionary?Actualización: Apple ha actualizado la página y eliminado el ejemplo de almacenamiento de un UITouch a través de un NSString y simplemente menciona la solución CFDictionaryRef que no es un objeto en absoluto.
me temo que estoy lejos de C y punteros cosas y necesitan ayuda para comprender la razón por la que hay un error en el código.
He intentado con la solución NSValue pero tuve el mismo resultado que con NSString: funcionaba bien el 99% del tiempo, pero seguía siendo el 1% de los errores. Ahora supongo que es un error de Apple (el hecho de que la página que mencioné en mi pregunta acaba de actualizarse hace unos días es otra pista, incluso el personal de Apple no está seguro de este problema) O un problema de concurrencia entre el momento en que Puse los datos y obtengo los datos. –