[在维护某些多点触摸“屏幕上绘制”代码时,遇到了一个与应如何在touchesBegan:withEvent:,touchesMoved:withEvent:和touchesEnded:withEvent:之间设置对触摸实例的引用有关的错误。
该代码使用NSDictionary实例在touchesBegan:withEvent:中存储触摸的引用,如下所示:
for (UITouch *touch in touches]) {
NSValue *touchValue = [NSValue valueWithPointer:touch];
NSString *key = [NSString stringWithFormat:@"%@", touchValue];
[myTouches setValue:squiggle forKey:key];
}
并通过touchesEnded:withEvent检索它们:这种方式:
for (UITouch *touch in touches) {
NSValue *touchValue = [NSValue valueWithPointer:touch];
NSString *key = [NSString stringWithFormat:@"%@", touchValue];
NSObject *valueFromDictionary = [myTouches valueForKey:key];
[myTouches removeObjectForKey:key];
}
在这最后的代码中,由于字典不知道键,因此valueFromDictionary偶尔会变为nil。偶尔,我指的是大约1%的时间。
现在已设置上下文,我的问题是:
知道为什么此代码有错误吗?我不确定为什么它不起作用,特别是因为错误发生的频率非常低]
Some doc from Apple指出,最好使用UITouch对象的地址作为键:,但是这意味着使用NSValue *对象而不是NSString *对象(,因此,由于事实,因此使用CFDictionaryRef而不是NSDictionary UITouch没有实现复制协议)。 为什么存储地址的NSString表示而不是NSValue本身不是一个能够使用NSDictionary的简单解决方案? [[更新:Apple更新了页面并删除了通过NSString,只是提到了“不是所有对象”的CFDictionaryRef解决方案。
[当您使用stringWithFormat将NSValue实例转换为字符串时,我相信您实际上是在调用[touchValue description],但我不确定这是否可以保证结果的一致性。例如,与许多对象一样,如果描述中包含指向NSValue实例本身的指针怎么办?在这种情况下,存储完全相同的指针的两个不同的NSValue实例将产生不同的字符串键。