NSet containsObject提供了不可预测的结果

时间:2018-02-11 04:38:38

标签: objective-c nsset

在我的下面的代码中[NSSet containsObject]给出了不可预测的结果。我发现具有值行的col3对象col(2,2)在我的while循环中被添加两次。 但是如果我在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;
}

1 个答案:

答案 0 :(得分:0)

问题是您的Cell3类缺少适当的hash实现。见https://developer.apple.com/documentation/objectivec/1418956-nsobject/1418859-hash