2

使用 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,我有什么不明白的地方吗?

4

1 回答 1

8

这没有按预期运行的原因是接收器 activeTileQueue(NSMutableOrderedSet 实例)已经包含该成员。

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

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

NSIndexSet *replacementSet = [NSIndexSet indexSetWithIndex:[[self activeTileQueue] indexOfObject:recentObject]];
[[self activeTileQueue] moveObjectsAtIndexes:replacementSet toIndex:0];
于 2012-12-14T00:44:11.333 回答