Objective-C - Как добавить объекты в 2d NSMutableArrays - PullRequest
1 голос
/ 18 марта 2010

NSMutableArray * insideArray = [[NSMutableArray alloc] init]; NSMutableArray * outsideArray = [[NSMutableArray alloc] init]; [insideArray addObject: @ "Hello 1"]; [insideArray addObject: @ "Hello 2"]; [outsideArray addObject: insideArray]; [insideArray removeAllObjects]; [insideArray addObject: @ "Hello 3"]; [insideArray addObject: @ "Hello 4"]; [outsideArray addObject: insideArray]; Токовый выход

    array(
      (
       "Hello 3",
       "Hello 4"
       ),
      (
       "Hello 3",
       "Hello 4"
       )
      )

Мне нужен способ, чтобы вывод был

    array(
      (
       "Hello 1",
       "Hello 2"
       ),
      (
       "Hello 3",
       "Hello 4"
       )
      )

У кого-нибудь есть решение или можно увидеть, где я ошибся? Спасибо

Ответы [ 5 ]

3 голосов
/ 18 марта 2010

На самом деле вы только создаете два массива здесь. Вы создаете «внешний» массив, а затем добавляете к нему две ссылки на тот же самый внутренний массив. Когда вы выводите его, вы видите эти два внутренних массива, ссылающиеся на одно и то же.

Вам необходимо создать более одного внутреннего массива здесь, так как вы ожидаете, что они будут содержать разные наборы значений.

Ключевым моментом здесь является то, что массивы - это просто ссылки на объекты, а очистка и повторное заполнение массива не создает новый; он просто меняет тот, который у вас уже есть.

2 голосов
/ 18 марта 2010

Вы используете один и тот же NSMutableArray для обоих вложенных массивов Вам нужно использовать два разных объекта. В частности, вместо

[insideArray removeAllObjects];

вместо этого используйте

[insideArray release];
insideArray = [NSMutableArray array];

для быстрого решения.

0 голосов
/ 18 марта 2010

Подумайте об этом с точки зрения управления памятью. Каждый раз, когда вы вводите «insideArray», компьютер видит ссылку на одну точку памяти. Хотя "[outsideArray addObject: insideArray];" помещает ссылку на объект insideArray в outsideArray, insideArray по-прежнему указывает на то же место в памяти.

Попробуйте создать новый объект и поместить его в outsideArray. Изменить: [outsideArray addObject: insideArray];

читать: [outsideArray addObject: [NSMutableArray arrayWithArray: insideArray]];

Это должно быть самое простое решение.

0 голосов
/ 18 марта 2010

Ну, вы удаляете «Hello 1» и «Hello 2» из insideArray, который является фактическим объектом, который хранится в outsideArray. Другими словами, outsideArray не знает содержимого insideArray.

0 голосов
/ 18 марта 2010

Я думаю, что проблема в том, что когда вы добавляете объект в массив, массив не копирует данный объект, он просто хранит ссылку на него и увеличивает счетчик хранения на единицу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...