Это совершенно верно:
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 … in
или NSEnumerate
, но использование индекса вполне допустимо.
Что меня беспокоит, так это ваше неправильное понимание указателей.
Если бы это был цикл, в котором вам не разрешалось изменять массив, это не скопировало бы массив, а только указатель на массив, эффективно изменив массив, на который вы не имеете права. (Я даже не уверен, работает ли это.)
Вместо простого копирования указателя
// 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
.