检查NSArray中是否存在唯一对象

3
我有一个NSMutableArray,可以往里面添加对象。添加的对象是包含一堆SUP数据的 SUPDataValue 对象。
在另一个视图中,我将这个对象数组分成一个NSMutableArray,其中包含每个表格视图部分的NSMutableArray。 当我向我的初始对象数组添加另一个 SUPDataValue 对象,并切换回我的表格视图时,我想重新读取对象数组中的所有对象,并查看这些对象是否存在于我的分层数组中。
我正在使用“objectExists”,它运行良好……然而……如果我将同一个对象两次添加到我的对象数组中,它将始终认为它存在于一个层中。
这是我的代码:
- (void)setInitialComponents:(NSMutableArray*)components
{
    if (self.componentLayer)
    {
        for (SUPDataValueList *val in components)
        {
            BOOL found = NO;

            for (NSMutableArray *layer in self.componentLayer)
            {
                if ([layer containsObject:val])
                {
                    found = YES;
                }
            }

            if (!found)
            {
                [[self.componentLayer objectAtIndex:0] addObject:val];
            }
        }
    }
    else {
        self.componentLayer = [NSMutableArray array];

        // Add the no-layer layer (section 0)
        [self.componentLayer addObject:[NSMutableArray array]];

        if (self.addMode)
        {
            [[self.componentLayer objectAtIndex:0] addObjectsFromArray:components];
        }
        else {
            for (SUPDataValueList * val in components)
            {
                int layer = [[NSString stringWithFormat:@"%@", [val item:38]] intValue];

                if (self.componentLayer.count < layer)
                {
                    [self.componentLayer insertObject:[NSMutableArray array] atIndex:layer-1];
                }

                [[self.componentLayer objectAtIndex:layer-1] addObject:val];
            }
        }
    }

    [self.tableView reloadData];
}

正如你所猜测的那样,我的问题出在这里:
if ([layer containsObject:val])
{
    found = YES;
}

我想要检查一个唯一的对象是否存在于该数组中(使用内存分配ID或其他方式?)

我该如何做到这一点?


为什么不直接使用 NSSet 呢? - user529758
因为如果我没有记错的话,你不能将两个相同的对象添加到NSSet中。我尝试了一个NSSet,但只得到了一个SUPDataValue对象,而不是多个相同的对象。 - Paul Peelen
NSCountedSet 可能适合你的需求。 - Monolo
好的,我会看一下。 - Paul Peelen
2个回答

4

containsObject方法会在比较底层对象时调用isEqual方法。

除非你在SUPDataValueList对象中实现了isEqual方法,否则它将仅执行指针比较,这是NSObject中isEqual方法的默认行为。


好的,你的意思是我必须将同一个对象多次添加到我的组件数组中,对吗? - Paul Peelen
我找到了解决方案。我一遍又一遍地添加了相同的内存对象,由于SUP不支持在SUPDataValueList上进行复制,因此我不得不围绕它编写自己的解决方案。所以,间接地说,你的答案是正确的。它正好按照应该包含对象的方式工作。 - Paul Peelen

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接