gpt4 book ai didi

objective-c - NSMutableOrderedSet 的意外行为

转载 作者:行者123 更新时间:2023-12-04 03:07:57 24 4
gpt4 key购买 nike

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

最佳答案

这没有按预期运行的原因是因为接收器 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com