2012-02-02 3 views
1

배열에 두 개의 객체를 추가하려고하지만 배열을 검사 할 때 두 번째 객체가 목록에 두 번 나타납니다. 아무도 이유를 아나요?NSMutableArray를 채울 때 중복 됨

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

두 인물 인스턴스는 만들지 않고 하나만 만듭니다.

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 변수는 여전히 첫 번째 사람 인스턴스를 가리 킵니다. 변수를 새 인스턴스로 변경해야합니다. 그렇지 않으면 단순히 사람을 두 번 삽입하고 속성을 덮어 씁니다.

+0

나는 원래 이것을했지만,''Redefinition of person'' 오류가 발생합니다. – Coderama

+1

두번째 줄의'Person *'을 삭제하는 것을 잊어 버렸을 것입니다. – Regexident

+0

그게 다야! 감사! – Coderama

2

한 명만 만들었습니다. 이 시도 :

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]; 

여기에서 문제는 당신이 배열에 첫 번째 사람을 추가 한 다음 원래 객체를 수정하는 경우, 객체는 또한 배열의 수정이다 --- 새 버전을 인스턴스화 할 필요가 "person"객체의 이름을 변경하고 수정하십시오. 당신이 많은, 많은 사람을 만들려면

, 나는 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]; 
} 
+0

이 방법이 효과적이지만 person 변수를 다시 사용 (다시 초기화)하면 다른 'Person' 변수를 만들 필요가 없습니다. – Coderama

+0

나는 종종 이것을 for 루프로한다. 위의 편집을 참조하십시오. – bryanjclark

3

문제는 배열 대신, 추가 전달 된 객체의 복사본을하지 않는다는 것입니다 객체에 대한 참조 만 보유합니다. 그래서 당신이하고있는 일은 객체를 생성하고 그 속성에 할당하고, 배열에 대한 참조를 제공하고, 같은 객체를 변경 한 다음 동일한 (그러나 돌연변이 된) 객체를 배열에 다시 추가하는 것입니다.

동일한 개체를 변경하는 대신 매번 새로운 Person 개체를 만들어야합니다.