2009-09-16 48 views
0

當你有一個NSArray,你要評估和更改的元素,你不能從陣列內循環改變。所以,你創建一個可變的副本可以改變。術語問題通一個NSArray在Objective-C

代碼例如:

NSMutableArray *bin = [NSMutableArray arrayWithObjects:@"0", @"1", @"2", @"3", @"4", @"5", @"6", @"7", nil]; 
NSMutableArray *list = [NSMutableArray arrayWithObjects:@"a1", @"b2", @"c3", @"e4", nil]; 

NSMutableArray *listHolder = list; // can't mutate 'list' within loop so create a holder 

for (int i = 0; i < [list count]; i++) { 
    [listHolder replaceObjectAtIndex:i withObject:[bin objectAtIndex:i]]; 
} 

那是什麼第二陣列listHolder稱爲?我的意思是,術語被用來指代在這方面的數組。

+0

你是不是要製作'bin'和'list' NSArrays? – outis 2009-09-16 10:10:35

+0

會改變你對這個問題的答案嗎? – willc2 2009-09-17 01:14:27

回答

1

在此情況下,listHolder將被稱爲拷貝

雖然你的代碼有一個錯誤。這條線是不實際製作副本,它只是讓listHolderlist均引用同一個數組對象:

NSMutableArray *listHolder = list; 

這將是一個實際的副本:

NSMutableArray *listHolder = [list mutableCopy]; 

確保您使用mutableCopy而不僅僅是copy,如果你想複製是可變的。 copy方法將返回所有可變類的不可變變體,如NSMutableSet,NSMutableDictionary等等。

另外,正如其他人已經注意到,它只在for (item in collection)循環內枚舉集合不能被突變。在正常的for (;;)突變是完全可以的,但如果集合中的項目數量發生變化,可能會導致奇怪的結果。

+0

感謝您的錯誤捕獲。我通常在可能的情況下使用(收集項目),並選擇了一個不好的代碼示例。我很高興我這樣做,因爲它暴露了我在關於指針的想法中的一個錯誤。 – willc2 2009-09-17 00:15:19

1

沒有特定的風格或常見名稱爲這個被普遍使用,它是你的代碼畢竟,如果他們有適當的條件使用它們。

話雖如此,一般如果你在這種情況下沒有特定的名字,那麼人們將原始列表稱爲「源」(src),並將最終列表稱爲「目的地」(dst),就像在記憶blitting風格的操作。

4

這是完全正確的:

NSMutableArray *bin = [NSMutableArray arrayWithObjects:@"0", @"1", …, @"7", nil]; 
NSMutableArray *list = [NSMutableArray arrayWithObjects:@"a1", …, @"e4", nil]; 

// NSInteger should be used instead of int 
for (NSInteger i = 0; i < [list count]; i++) { 
    [list replaceObjectAtIndex:i withObject:[bin objectAtIndex:i]]; 
} 

不允許你改變for … inNSEnumerate循環中的數組,但使用的指標是完全有效的。

讓我煩惱的是你對指針的誤解。
如果它是一個你不允許修改數組的循環,這將不會複製數組,而是隻複製指向數組的指針,從而有效地修改你不允許的數組。 (我什至不知道,如果這個工程。)

而不是僅僅複製指針

// can't mutate 'list' within loop so create a holder 
NSMutableArray *listHolder = list; 

做一個真正的副本:

NSMutableArray *copy = [[list mutableCopy] autorelease]; 

如果我真的有做副本我試圖根據其內容命名。例如:

NSMutableArray *views; 
NSMutableArray *reorderedViews = [views mutableCopy]; 

// reorder reorderedViews 

有時很難找到一個足夠好的名字,然後我通常只使用nameCopy

+0

這是有用的信息,並感謝你,但你沒有回答這個問題。我選擇了一個不好的代碼示例,並將問題出軌。至少我學到了一些東西。 – willc2 2009-09-17 00:18:33

0

原始NSArray的臨時可變副本將是我將如何引用它。