2012-12-13 200 views
2

使用的NSMutableOrderedSet,我得到意外的行爲。意外行爲NSMutableOrderedSet

我設置爲0指數在接下來的通話對象,我讀出索引爲0的對象它是如何指針我回來是不一樣的,因爲我剛插入的一個?在我的日誌記錄的聲明,但都當我評價設置斷點後,指針,對象是SomeObject的不同實例 -

- (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 。有什麼我不明白NSMutableOrderedSet嗎?

+0

看來, 'insertObject:atIndex'使NSMutableOrderedSet在內部重新排列對象。如果你調用'addObject','objectAtIndex:index'將返回相同的地址。 –

+0

@BorisProhaska它應該重新排列對象並將其他對象索引移位+1 - 但仍然如果我將對象設置爲零,然後在零處讀取對象,它應該是相同的。如果我添加對象,它會將它追加到集合(據我所知),然後檢索索引爲零的對象*將會不同... – isaac

+0

我無法用'[NSMutableArray new]重現'作爲'recentObject'。如果你創建了一個簡單的測試用例,你還會得到錯誤嗎?如果沒有,該錯誤不在此代碼中。 – Chuck

回答

8

如預期這並沒有表現的原因是因爲接收器activeTileQueue(在NSMutableOrderedSet實例)已經包含的成員。

雖然我專門尋找使用一組與一個數組,因爲我不想讓任何插入對象的副本,我怎麼插入會在這種情況下工作的假設是不正確的。我認爲如果集合已經包含我試圖插入的成員,而不是被重新種植,成員將被重新定位到在-insertObjectAtIndex中傳遞的索引。這是不正確的。

如果接收器已經包含成員,它沒有重新插入或重新排序。總之,沒有任何反應。爲了獲得最初期望的行爲,我將不得不刪除原始成員並重新插入它,或者在NSMutableOrdered集上使用另一種方法重新設置/交換集內的索引,例如:

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

感謝調查的行爲 - insertObject:atIndex:當對象已經在集合中時 - 文檔對此是無聲的。 –