Установка nsmutablearray на то же значение, что и другое, меняет оба? - PullRequest
1 голос
/ 17 апреля 2011

У меня есть NSMutableArray, называемый контейнером, и NSMutableArray, называемый temp. Чтобы сделать темп, у меня есть:

temp = container;

Теперь, когда я меняю что-то в temp, например:

[temp replaceObjectAtIndex:1 withObject:[NSNumber numberWithFloat:0.9f]];

Изменяет темп, а также меняет значение в контейнере. Почему это? И как я могу это остановить?

РЕДАКТИРОВАТЬ: Хорошо, я изменил его на temp = [[container mutableCopy] autorelease];, как предложено

Теперь проблема в том, что эта строка:

[temp replaceObjectAtIndex:1 withObject:[NSNumber numberWithFloat:0.9f]];

все еще меняет значение в контейнере.

Ответы [ 2 ]

4 голосов
/ 17 апреля 2011

Вы просто устанавливаете temp, чтобы использовать тот же указатель , что и container.

Чтобы получить истинную (независимую) копию контейнера, используйте это:

NSMutableArray *temp = [[container mutableCopy] autorelease];

Objective-C (будучи объектно-ориентированной производной от C ) использует указатели C для переменных объекта (это * в NSMutableArray *container).

И указатель c просто указывает на адрес в памяти .Таким образом, если вам нужно было установить temp на то же значение, что и container через temp = container;, вы просто назначаете temp тот же адрес , на который уже указывает container.Таким образом, изменение одного из них также изменит другое.Или правильнее: вы просто меняете один из них .Просто выглядит так, как будто вы меняете оба , но на самом деле вы просто используете два указателя, указывающие на один и тот же экземпляр объекта, который изменяется .

1 голос
/ 17 апреля 2011

Вы просто ссылаетесь на то же место в памяти, то есть на тот же массив. Что вы хотите сделать, это скопировать контейнерный массив:

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