NSet containsObject 给出了不可预测的结果
NSet containsObject is giving unpredictable results
在我的以下代码中,[NSSet containsObject] 给出了不可预测的结果。我发现在我的 while 循环中,具有值 row,col (2,2) 的 Cell3 对象被添加了两次。 但是,如果我在 isEqual 方法中设置断点,在 if 条件行上,则 (2,2) 不会被添加两次。
这个问题是否与代码优化有关。当我很久以前使用 C++ 工作时,我在调试与发布模式下看到了这些类型的问题。如果您设置断点,那么问题不会发生,但如果没有断点,那么问题就会发生。我在 XCode 中从未见过这种问题。我正在使用 XCode 版本 9.2(9C40b)
@interface Cell3 : NSObject
@property(assign) NSInteger row;
@property(assign) NSInteger col;
-(instancetype) initWithRow:(NSInteger)row col:(NSInteger)col;
@end
@implementation Cell3
-(instancetype) initWithRow:(NSInteger)row col:(NSInteger)col
{
self = [super init];
if(self)
{
self.row = row;
self.col = col;
}
return self;
}
- (BOOL)isEqual:(Cell3*)object
{
if(self.row == object.row && self.col == object.col)
return YES;
else
return NO;
}
@end
int NSSetTest()
{
NSMutableSet *uniqueCells = [[NSMutableSet alloc]init];
int a = 0;
int b[9][2] = { {0,0}, {1,0}, {2,0}, {3,0}, {3,1}, {3,2}, {2,2}, {2,3}, {2,2} };
while(a < 9)
{
Cell3 *cell = [[Cell3 alloc] initWithRow:b[a][0] col:b[a][1]];
if(![uniqueCells containsObject:cell])
{
[uniqueCells addObject:cell];
}
a++;
}
return 0;
}
问题是您的 Cell3 class 缺少适当的 hash
实现。参见 https://developer.apple.com/documentation/objectivec/1418956-nsobject/1418859-hash
在我的以下代码中,[NSSet containsObject] 给出了不可预测的结果。我发现在我的 while 循环中,具有值 row,col (2,2) 的 Cell3 对象被添加了两次。 但是,如果我在 isEqual 方法中设置断点,在 if 条件行上,则 (2,2) 不会被添加两次。
这个问题是否与代码优化有关。当我很久以前使用 C++ 工作时,我在调试与发布模式下看到了这些类型的问题。如果您设置断点,那么问题不会发生,但如果没有断点,那么问题就会发生。我在 XCode 中从未见过这种问题。我正在使用 XCode 版本 9.2(9C40b)
@interface Cell3 : NSObject
@property(assign) NSInteger row;
@property(assign) NSInteger col;
-(instancetype) initWithRow:(NSInteger)row col:(NSInteger)col;
@end
@implementation Cell3
-(instancetype) initWithRow:(NSInteger)row col:(NSInteger)col
{
self = [super init];
if(self)
{
self.row = row;
self.col = col;
}
return self;
}
- (BOOL)isEqual:(Cell3*)object
{
if(self.row == object.row && self.col == object.col)
return YES;
else
return NO;
}
@end
int NSSetTest()
{
NSMutableSet *uniqueCells = [[NSMutableSet alloc]init];
int a = 0;
int b[9][2] = { {0,0}, {1,0}, {2,0}, {3,0}, {3,1}, {3,2}, {2,2}, {2,3}, {2,2} };
while(a < 9)
{
Cell3 *cell = [[Cell3 alloc] initWithRow:b[a][0] col:b[a][1]];
if(![uniqueCells containsObject:cell])
{
[uniqueCells addObject:cell];
}
a++;
}
return 0;
}
问题是您的 Cell3 class 缺少适当的 hash
实现。参见 https://developer.apple.com/documentation/objectivec/1418956-nsobject/1418859-hash