2011-11-24 2 views
2

목적 C의 실제 유형, 대 선언하고 다음이내가 내 코드에 뭔가를 디버깅했다

NSMutableSet *s = [[NSMutableArray alloc] init]; 

Card *c = [[Card alloc] init]; 

[s addObject:c]; 
[s addObject:c]; 
[s addObject:c]; 

NSLog(@"Set now contains %d cards ", [s count]); //Prints 3 

컴파일 것을 깨달았다 그러나 선언 된 유형은 여기에서 설정 ... 왜 중복이 허용됩니다입니까? 이것이 왜 모두 컴파일됩니까?

+1

실제로 배열을 배열로 할당하고 있습니까, 아니면 첫 줄에 오타가 있습니까? –

+0

물론 이것은 오타입니다. 그러나 질문은 이것이 왜 전혀 컴파일되지 않는가라는 것입니다. –

+0

나는 이것에 대해서도 궁금하다. 그래서 나는 빠른 테스트를했다. 동일한 코드의 경우 출력이 1입니다. 어떻게 3을 얻었습니까? set이 중복 된 값을 저장하지 않는다는 것은 사실이지만 중복 값을 추가 할 수 없다는 것을 의미하지는 않습니다. 그것은 논리 "오류"의 문제이며 따라서 컴파일러는 불평하지 않습니다. –

답변

4

[[NSMutableArray alloc] init] 반환 형식은 id이며 Objective-C가 반환하는 형식은 id입니다. 대부분의 경우 반환되는 실제 유형은 클래스 구현에 따라 다르며 많은 Apple 제공 클래스는 클래스 클러스터이며 다른 유형을 반환합니다. 이에 대한 일반적인 예는 NSString입니다. 일반적으로NSCFString 클래스의 인스턴스를 반환합니다.

클래스 이름을 일치시키는 데주의해야합니다.

또한 Marc Charbonneau here

+0

감사합니다. 완벽한 의미가있다. –

2

[[NSMutableArray alloc] init] 반환 @CocoaFu가 언급 한 바와 같이 id으로 대답을 참조하십시오. 반환 된 id 때문에 허용되는 NSMutableSet으로 선언 한 포인터에 할당하고 있습니다. 다른 언어와 마찬가지로 NSMutableSet으로 선언했기 때문에 하나가되지 않습니다.

NSMutableSetNSMutableArray 모두 -addObject:이라는 메서드가 있기 때문에 컴파일러에서 알 수없는 메서드가 호출되었다는 경고가 표시되지 않습니다.

선언 된대로 포인터 이외의 코드에 특정 오류가있는 것은 정확하지 않습니다.

관련 문제