使用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]);
}
Run Code Online (Sandbox Code Playgroud)
我想,在这个方法结束时,recentObject应该== whatIJustInsereted - 但是在我的日志语句中以及在设置断点后评估指针时,对象都是SomeObject的不同实例.有什么我不明白NSMutableOrderedSet?
这不符合预期的原因是因为接收者activeTileQueue(NSMutableOrderedSet实例)已经包含该成员.
虽然我特意寻求使用集合与数组,因为我不想要插入任何对象的重复,但我在这种情况下关于插入如何工作的假设是不正确的.我假设如果集合已经包含我试图插入的成员,那么该成员将被重新定位到-insertObjectAtIndex中传递的索引.这是不正确的.
如果接收器已包含该成员,则不会重新插入或重新排序.简而言之,没有任何反应.要获得最初所需的行为,我必须删除原始成员并重新插入它,或者使用NSMutableOrdered上的另一个方法来重新定位/交换集合中的索引,例如:
NSIndexSet *replacementSet = [NSIndexSet indexSetWithIndex:[[self activeTileQueue] indexOfObject:recentObject]];
[[self activeTileQueue] moveObjectsAtIndexes:replacementSet toIndex:0];
Run Code Online (Sandbox Code Playgroud)