NSArrays в NSArrays. Проблема с указателем? - PullRequest
1 голос
/ 31 марта 2010

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

У меня шесть NSArrays. Я хочу дополнительный NSArray, состоящий из этих шести массивов, поэтому:

self.arr1 = [NSArray array];
self.arr2 = [NSArray array];
self.arr3 = [NSArray array];
self.arr4 = [NSArray array];
self.arr5 = [NSArray array];
self.arr6 = [NSArray array];

NSArray *containerArray = [[NSArray alloc] initWithObjects:self.arr1, ... etc, nil];

Всякий раз, когда я обновляю один из первых 6 NSArrays, я хочу обновить объект в containerArray. (Я знаю, что я использую NSArray, а не NSMutableArray, когда я обновляю массивы, я создаю новый и назначаю его переменной экземпляра).

В настоящее время любые манипуляции с arr1 не отражаются в [containerArray objectAtIndex: 0].

Ответы [ 3 ]

8 голосов
/ 31 марта 2010

Поскольку переменные вашего экземпляра self.arr1, self.arr2 являются заполнителями для переменной типа NSArray, но при их обновлении вы просто теряете старую ссылку, которая все еще остается в containerArray.

Чтобы объяснить лучше:

self.arr1 <------ [NSArray array] (the first one you create)

тогда вы создаете contentArray и получаете:

self.arr1 <--------------------------+-- [NSArray array] (first one you create)
                                     |
[contentArray objectAtIndex:0] <-----+   

после создания contentArray и присвоения ему массивов у вас есть дублированные ссылки. self.arr1 будет указывать на тот же массив, на который указывает первый элемент contentArray и т. Д. Для других.

Затем вы обновляете self.arr1 = [NSArray array] новым массивом, поэтому вы получаете

self.arr1 <------------ [NSArray array] (new one created)

[contentArray objectAtIndex:0] <----- [NSArray array] (the old one)

Так что же случилось?

Вы создали новый массив и присвоили ему self.arr1. Так что self.arr1 будет указывать на новый элемент, а [contentArray objectAtIndex:0] будет по-прежнему ссылаться на старый. Каждая модификация self.arr1 не будет отражена на другой, потому что они НЕ того же объекта.

Это потому, что вы используете ссылки на объекты, а не на простые объекты. Когда вы присваиваете новый массив self.arr1, вы не изменяете старый, а отбрасываете ссылку на него для нового, который заменяет старый.

Вот почему вы должны использовать NSMutableArray: потому что в этом случае вы удалили бы / добавили элементы в тот же массив, не создавая новый.

1 голос
/ 31 марта 2010

На самом деле, NSArray предоставит вам желаемое поведение, поскольку оно поддерживает строгие ссылки на объекты, которые вы ему даете.Из NSArray Class Reference :

Массивы поддерживают строгие ссылки на свое содержимое - в среде управляемой памяти каждый объект получает сообщение сохранения, прежде чем его идентификатор добавляется в массив исообщение об освобождении, когда оно удаляется из массива или когда массив освобождается.

А пока, похоже, Джек опубликовал объяснение, которое я собирался дать, поэтому я оставлю его начто.

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

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

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