2014-02-24 3 views
3

id는 코코아에서 비롯된 것 같은 NSObject를 상속받지 않는 오브젝트조차도 모든 오브젝트 유형에 해당하는 것으로 알고 있습니다. 나는 거의 항상 id를 사용한다고 들었지만, API를 만들고, Animal이라는 객체와 같은 특정 유형의 객체 만 가져야한다는 점을 분명히하고 싶다면, 여전히 사용하겠습니까?Objective-C id & NSObject

(id) animal 

아니면 내가 너무 많은

(Animal) animal 

감사 할 것입니다!

+11

"거의 항상 'id'를 사용하라 '고 말한 사람은 누구나 틀렸어. 보유하고있는 특정 유형을 사용하십시오. 'id'를 사용하고자하는 곳은 모호한 타입을 반환 할 때입니다. NSDictionary objectForKey를 말하십시오. 그것이'id'라고 선언되면, 컴파일러는 타입이 지원하지 않는 메소드 호출에 대해 불평하지 않을 것입니다. –

+0

@HotLicks - "모호한"? ;-) – CRD

+2

또한 : "코코아로부터의 것들"은 본질적으로 모두 NSObject에서도 상속됩니다. –

답변

2

Animal부터 시작하여 상속 체인을 통해 NSObjectid까지 모든 유형을 사용할 수 있습니다. 모든 것이 유효합니다. 그러나 대부분의 경우 개체에 대한 일반적인 포인터가있는 아주 당신이

6

id 작업에 필요한 입력이 있기 때문에 단지 Animal를 사용할 필요가 - 그것은 목적에 대한 포인터 해야 점 것을 제외하고, void *처럼 -C 개체. 그래서 그래, 당신은 보다 구체적인 개체 포인터 유형이 일하는 것이 대부분의 경우 id를 사용할 수 있지만, 더 특정 유형 사용하는 것이 좋습니다 : 당신이 보면 당신은 많은 예를 찾을 수 있습니다

- (id)animal; // OK if 'animal' could be any type of object 
- (Animal*)animal; // much better if you know that 'animal' points to an object of type 'Animal' 

을 어떤 코코아 또는 코코아 터치 클래스에서. 의는 UIView 조금 살펴 보자 :

- (BOOL)isDescendantOfView:(UIView *)view; // returns YES for self. 
- (UIView *)viewWithTag:(NSInteger)tag;  // recursive search. includes self 

당신이 볼 수 있듯이, 첫 번째 방법은 매개 변수로 UIView* 걸립니다. UIView의 인스턴스에 대한 포인터 이외의 다른 값을 전달하려고하면 컴파일러에서 오류가 발생합니다.

는 두 번째 방법은 UIView* 반환, 당신은 UIView 이해 다른 메시지의 수신자로 직접 결과를 사용할 수 있습니다 : 매개 변수의 유형에 대한 특정 인

[[topView viewWithTag:someTag] removeFromSuperview]; 

과 값을 반환 컴파일러의 도움을 할 수 있습니다 개체에 적절한 메시지를 보내고 올바른 값을 반환하는지 확인하십시오.