使用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吗?
答案 0 :(得分:8)
这不符合预期的原因是因为接收者activeTileQueue(NSMutableOrderedSet实例)已经包含该成员。
虽然我特意寻求使用集合与数组,因为我不希望插入任何对象的重复,但我在这种情况下关于插入如何工作的假设是不正确的。我假设如果集合已经包含我试图插入的成员,那么该成员将被重新定位到-insertObjectAtIndex中传递的索引。这是不正确的。
如果接收方已包含该成员,则不会重新插入或重新订购。简而言之,没有任何反应。为了获得最初期望的行为,我必须删除原始成员并重新插入它,或者使用NSMutableOrdered上的另一个方法来重新定位/交换集合中的索引,例如:
NSIndexSet *replacementSet = [NSIndexSet indexSetWithIndex:[[self activeTileQueue] indexOfObject:recentObject]];
[[self activeTileQueue] moveObjectsAtIndexes:replacementSet toIndex:0];