2010-06-14 6 views
0

У меня есть и NSMutableArray, и я хочу, чтобы заменить его другим, но если я пытаюсь сделать это так ...Заменить массив с массивом

firstArray = secondArray; 

... то, кажется, стереть весь firstArray и я получаю сообщение об ошибке ..

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSCFArray objectAtIndex:]: index (0) beyond bounds (0)' 

... и оценки должны быть (6) нет (0).

Есть ли правильный способ заменить массив?

PS: Я уже проверил secondArray и отлично работает.

ответ

0

вы назначая указатель firstArray на что указатель secondArray, так что вы потеряете ссылку на объект firstArray, и он получает просочился , Если вы хотите заменить объекты в объекте firstArray, используйте что-то вроде -replaceObjectsInRange:withObjectsFromArray: или просто -release объект firstArray и присвойте firstArray [secondArray mutableCopy].

Я рекомендую читать на указателях C, а также правила управления памятью Objective-C, чтобы убедиться, что у вас есть четкое понимание основ.

+0

Я все еще получаю ту же ошибку. Я даже пробовал ... для (int place = 0; place <7; place ++) { [firstArray replaceObjectAtIndex: place withObject: [secondArray objectAtIndex: place]]; } ... и он по-прежнему устанавливает диапазон firstArray в (0). Все остальное. –

+0

Nevermind, я исправил эту проблему, но теперь у меня есть новая. Я отправляю по новому вопросу. –

1

Если вы хотите, чтобы сделать переменную firstArray в ссылку на второй, это сделать:

[firstArray release]; 
firstArray = [secondArray retain]; 

Если вы хотите сделать firstArray копию второго, сделайте следующее:

[firstArray release]; 
firstArray = [secondArray mutableCopy]; 

(В обоих случаях release предполагает, что вы выделили массив или ранее использовали retain -ed или copy. Если нет, вы можете пропустить этот бит. В любом случае у вас есть новый массив и должен быть release это в подходящее время.)

Если вы хотите заменить содержимое первого массива на содержимое второго (что не так сильно отличается от взятия копии, но включает в себя еще одно уничтожение и создание объектов), то я думаю, что вы должны сделать что-то вроде этого:

[firstArray removeAllObjects]; 
[firstArray addObjectsFromArray:secondArray]; 
+0

[копия второгоArray] вернет неизменяемую копию. – 2010-06-14 23:07:45

+0

Ой, совершенно верно. Исправлена. – walkytalky

Смежные вопросы