Дублировать при заполнении NSMutableArray - PullRequest
1 голос
/ 03 февраля 2012

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

list = [[NSMutableArray alloc] init];
Person *person = [[Person alloc] init];

// Create person 1
person.name = @"Fred";
person.gender = @"unknown";

// Append to array
[list addObject:person];
[person release];

// Create person 2
person.name = @"Bob";
person.gender = @"male";

// Append to array again
[list addObject:person];
[person release];

Ответы [ 3 ]

3 голосов
/ 03 февраля 2012

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

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

3 голосов
/ 03 февраля 2012

Вы создаете не два экземпляра человека, а только один.

Или сделайте это:

list = [[NSMutableArray alloc] init];
Person *person;

// Create person 1
person = [[Person alloc] init];
person.name = @"Fred";
person.gender = @"unknown";

// Append to array
[list addObject:person];
[person release];

// Create person 2
person = [[Person alloc] init]; //this line right here!
person.name = @"Bob";
person.gender = @"male";

// Append to array again
[list addObject:person];
[person release];

или назначьте второго человека второй переменной.

Переменная person по-прежнему указывает на экземпляр от первого лица.Вам нужно изменить переменную на новый экземпляр, иначе вы просто вставляете человека дважды и перезаписываете его свойства.

2 голосов
/ 03 февраля 2012

Вы создали только одного человека.Попробуйте это:

list = [[NSMutableArray alloc] init];
Person *person = [[Person alloc] init];

// Create person 1
person.name = @"Fred";
person.gender = @"unknown";

// Append to array
[list addObject:person];
[person release];

// Create person 2
Person *person2 = [[Person alloc] init];
person2.name = @"Bob";
person2.gender = @"male";

// Append to array again
[list addObject:person2];
[person release];

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

Если вы хотите создать много-много людей, я предлагаю использовать цикл for:

NSArray *names = [NSArray arrayWithObjects:@"Fred", @"Bob"];
NSArray *genders = [NSArray arrayWithObjects:@"unknown", @"male"];

for (int i = 0; i<[names count]; i++) {
    Person *person = [[Person alloc] init];
    person.name = [names objectAtIndex:i];
    person.gender = [genders objectAtIndex:i];
    [list addObject:person];
    [person release];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...