NSMutableOrderedSet出现意外行为

时间:2012-12-13 22:18:09

标签: objective-c nsset

使用NSMutableOrderedSet,我遇到了意想不到的行为。

我在索引0处设置了一个对象。在下一次调用中,我在索引0处读出了对象。我得到的指针与我刚刚插入的指针不一样?

- (void)setRecentObject:(SomeObject *)recentObject
{
    // self.activeQueue is a viable instance of NSMutableOrderedSet

    [[self activeTileQueue] insertObject:recentObject atIndex:0];
    SomeObject *whatIJustInserted = [[self activeTileQueue] objectAtIndex:0];

    DebugLog(@"set url at zero: %@, and read back url at zero: %@",[recentObject someDescription], [whatIJustInserted someDescription]);

}

我认为,在这个方法结束时,recentObject应该== whatIJustInsereted - 但是在我的日志语句中以及在设置断点后评估指针时,对象都是SomeObject的不同实例。有什么我不了解NSMutableOrderedSet吗?

1 个答案:

答案 0 :(得分:8)

这不符合预期的原因是因为接收者activeTileQueue(NSMutableOrderedSet实例)已经包含该成员。

虽然我特意寻求使用集合与数组,因为我不希望插入任何对象的重复,但我在这种情况下关于插入如何工作的假设是不正确的。我假设如果集合已经包含我试图插入的成员,那么该成员将被重新定位到-insertObjectAtIndex中传递的索引。这是不正确的。

如果接收方已包含该成员,则不会重新插入或重新订购。简而言之,没有任何反应。为了获得最初期望的行为,我必须删除原始成员并重新插入它,或者使用NSMutableOrdered上的另一个方法来重新定位/交换集合中的索引,例如:

NSIndexSet *replacementSet = [NSIndexSet indexSetWithIndex:[[self activeTileQueue] indexOfObject:recentObject]];
[[self activeTileQueue] moveObjectsAtIndexes:replacementSet toIndex:0];