我有一个包含数千个NSValue对象的NSSet(包装CGPoints).我想很快找到NSSet中是否存在给定的CGPoint值.在我看来,NSSet的member:方法可以在这里完成工作,除了它使用isEqual:检查相等性. NSValue对象使用isEqualToValue:,因此当我执行代码时:
[mySet member:valueToCheck];
它实际上导致Xcode崩溃.
1)是否有某种方法可以使用自定义相等性检查使其适用于NSValue对象?
2)这是否是最好的方法(即成员:首先是否足够快)?场景是我有一个NSSet包含大量代表屏幕上像素的点(iPad).后来我需要以每秒数千点的速度轰击那一组,看看它们是否存在于集合中.我的方法似乎很难实现这一点.我想创建类似于一个巨大的二维位数组的东西,每个索引代表屏幕上的一个像素.一旦我知道我正在测试的那个点,我就可以直接跳到阵列中的那一点并检查1或0 ……这听起来好不好?
谢谢
解决方法
你能把它变成一个简单的可重复的案例吗?例如,我刚试过:
NSValue *v = [NSValue valueWithCGPoint:CGPointMake(1,1)]; NSSet *s = [NSSet setWithObject:v]; NSLog(@"%@",[s member:[NSValue valueWithCGPoint:CGPointMake(1,1)]]);
但它的工作正常.
编辑
-isEqual:不是问题:
NSValue *v1 = [NSValue valueWithPoint:NSMakePoint(1,1)]; NSValue *v2 = [NSValue valueWithPoint:NSMakePoint(1,1)]; NSLog(@"%d",[v1 isEqual:v2]); //logs "1"
-hash不是问题:
NSLog(@"%d",([v1 hash] == [v2 hash])); //logs "1"
它们是不同的对象:
NSLog(@"%d",(v1 != v2)); //logs "1"
问题出在您的代码中.尝试清洁和重建.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。