使用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]);

}


以我的想法,在此方法的末尾,renewantObject应该== whatIJustInsereted-但是在我的日志记录语句中以及设置断点后评估指针时,这些对象都是SomeObject的不同实例。关于NSMutableOrderedSet,我是否不了解?

最佳答案

之所以无法按预期方式运行,是因为接收者activeTileQueue(NSMutableOrderedSet实例)已经包含该成员。

虽然我特别希望使用集合而不是数组,因为我不想插入任何对象的重复项,但是我对这种情况下插入将如何工作的假设是不正确的。我假设如果集合已经包含我要插入的成员,而不是重新插入,则该成员将被重新定位到-insertObjectAtIndex中传递的索引。这是不正确的。

如果接收者已经包含该成员,则不会重新插入或重新排序。简而言之,什么也没有发生。为了获得最初想要的行为,我将不得不删除原始成员并重新插入它,或者对NSMutableOrdered集使用另一种方法来重新定位/交换该集中的索引,例如:

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

关于objective-c - NSMutableOrderedSet的异常行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13869497/

10-13 03:45