NSSet -member检查NSValue的相等性

Stu*_*art 4 equality objective-c nsset ipad ios

我有一个NSSet包含数千个NSValue对象(包装CGPoints).我想很快找到一个给定的CGPoint值是否存在于NSSet.在我看来member:,一个NSSet可能在这里完成工作的方法,除了它使用检查相等性isEqual:.NSValue对象使用isEqualToValue:,所以当我执行代码时:

[mySet member:valueToCheck];
Run Code Online (Sandbox Code Playgroud)

它实际上导致Xcode崩溃.

1)是否有某种方法可以使用自定义相等性检查来使NSValue对象工作?

2)这是否是最好的方法(即首先是member:足够快)?场景是我有一个NSSet包含大量代表屏幕(iPad)像素的点.后来我需要以每秒数千点的速度轰击那一组,看看它们是否存在于集合中.我的方法似乎很难实现这一点.我想创建类似于一个巨大的二维位数组的东西,每个索引代表屏幕上的一个像素.一旦我知道我正在测试的那个点,我就可以直接跳到阵列中的那一点并检查1或0 ......这听起来好不好?

谢谢

Dav*_*ong 10

你能把它变成一个简单的可重复的案例吗?例如,我刚试过:

NSValue *v = [NSValue valueWithCGPoint:CGPointMake(1, 1)];
NSSet *s = [NSSet setWithObject:v];
NSLog(@"%@", [s member:[NSValue valueWithCGPoint:CGPointMake(1, 1)]]);
Run Code Online (Sandbox Code Playgroud)

但它的工作正常.

编辑

-isEqual: 不是问题:

NSValue *v1 = [NSValue valueWithPoint:NSMakePoint(1, 1)];
NSValue *v2 = [NSValue valueWithPoint:NSMakePoint(1, 1)];
NSLog(@"%d", [v1 isEqual:v2]); //logs "1"
Run Code Online (Sandbox Code Playgroud)

-hash 不是问题:

NSLog(@"%d", ([v1 hash] == [v2 hash])); //logs "1"
Run Code Online (Sandbox Code Playgroud)

它们是不同的对象:

NSLog(@"%d", (v1 != v2)); //logs "1"
Run Code Online (Sandbox Code Playgroud)

问题出在您的代码中.尝试清洁和重建.