2013-01-15 7 views
3

처음에는 사과하는 것이 다소 기본적인 질문이지만 목표 C를 처음 접했을 때 내 질문에 대한 답변을 찾을 수 없었습니다. 검색 (비록 내가 초보자이기 때문에 답변을 찾는 동안 정확한 용어를 사용하지 않았기 때문일 수도있다.)목표 C 배열 요소가 모두 같은 값으로 끝납니다

나는 그 안에 NSMutableArray에 몇 가지 사용자 정의 객체를 채우는 간단한 루프를 가지고있다. 내가 찾은 것은 루프 이후에 요소가 모두 같은 값을 갖는 배열을 가진다는 것이다. 즉, (0,1,2,3)을 삽입 한 후에 배열에 (3,3,3,3) .

내 개체를 사용할 때만 문제가 발생합니다. 문자열 만 추가하는 두 번째 배열은 예상 값으로 채워집니다.

내 배열에있는 개체의 주소를 보면 모든 개체가 다르다는 것을 알 수 있습니다. 즉, 동일한 개체를 참조하는 포인터 배열을 단순히 갖고 있지 않다는 것을 의미합니까?

내가 예상 한대로 작동하지 않는 이유를 이해하고 싶습니다. 나는 내가 누락 된 아주 기본적인 것이 있다는 느낌을 가지고 있으며, 어떤 통찰력도 크게 감사 할 것입니다.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSLog(@"STARTING"); 
    NSMutableArray* myArray1 = [NSMutableArray array]; 
    NSMutableArray* myArray2 = [NSMutableArray array]; 

    for (int i=0; i < 4; i++) { 
     MyObject* obj = [[MyObject alloc] initWithSomeString: [NSString stringWithFormat: @"ID%u", i] 
                AndSomeNum: i]; 
     [myArray1 addObject: obj]; 
     [myArray2 addObject: [NSString stringWithFormat: @"ID%u", i]]; 

     NSLog(@" Added to array1: %@", [myArray1 objectAtIndex: i]); 
     NSLog(@"  and array2: %@", [myArray2 objectAtIndex: i]); 
    } 

    NSLog(@"ALL DONE:\nARRAY1=%@\nARRAY2=%@", myArray1, myArray2); 
} 

나는이 프로그램을 실행 한 후 얻을 출력은 다음과 같습니다 :

@implementation MyObject 

NSString* _blah; 
int _num; 

-(MyObject*)initWithSomeString: (NSString*)blah AndSomeNum: (int)num { 
    self = [super init]; 
    _blah = [NSString stringWithString: blah]; 
    _num = num; 
    return self; 
} 

-(NSString*)description { 
    return [NSString stringWithFormat: @"num=%u self=<%p> str=<%p> str=%@", _num, self, _blah, _blah]; 
} 

@end 
:

STARTING 
    Added to array1: num=0 self=<0x928e9b0> str=<0x9290090> str=ID0 
     and array2: ID0 
    Added to array1: num=1 self=<0x9290080> str=<0x928ff80> str=ID1 
     and array2: ID1 
    Added to array1: num=2 self=<0x928eb00> str=<0x9290020> str=ID2 
     and array2: ID2 
    Added to array1: num=3 self=<0x7499a30> str=<0x7499ae0> str=ID3 
     and array2: ID3 
ALL DONE: 
ARRAY1=(
    "num=3 self=<0x928e9b0> str=<0x7499ae0> str=ID3", 
    "num=3 self=<0x9290080> str=<0x7499ae0> str=ID3", 
    "num=3 self=<0x928eb00> str=<0x7499ae0> str=ID3", 
    "num=3 self=<0x7499a30> str=<0x7499ae0> str=ID3" 
) 
ARRAY2=(
    ID0, 
    ID1, 
    ID2, 
    ID3 
) 

이것은 MyObject를 클래스의 구현입니다

내가 실행하는 루프입니다

답변

4

이 두 변수의 정의는 다음과 같습니다.

NSString* _blah; 
int _num; 

이 파일에이 파일들을 배치 한 경우 전역 변수로 정의됩니다. 따라서 모든 클래스 인스턴스가이 두 변수를 공유합니다. 이것이 초기화 프로그램을 호출 할 때마다 동일한 '_blah'가 겹쳐 쓰여지는 이유입니다.

변수가 인 인스턴스 개이고 각 인스턴스의 고유 한 '_blah'및 '_num'이있는 경우 해당 클래스의 구현 또는 인터페이스에서 {} 내에 선언해야합니다. 예를 들면 다음과 같습니다.

@implementation MyObject { 

NSString* _blah; 
int _num; 

} // continue with method definitions... 
+0

Aaargh! 완벽한 - 그런 간단한 대답. 많은 감사 – user1979082