2014-08-20 2 views
3

에서 MyClass.h정규 구문을 사용할 수있는 이유는 점 표기법을 사용하여 ID에 사용할 수없는 이유는 무엇입니까?

@interface MyClass : NSObject 

@property (nonatomic) NSString *something; 

@end 

MyClass.m 그런

@implementation MyClass 

@end 

내가 할이 :

MyClass *instance = [[MyClass alloc] init]; 
    id theSame = instance; 

    [theSame setSomething:@"hh"]; // No error 
    theSame.something = @"hh"; // "Property 'something' not found…" 

왜 네 번째 줄에 오류가 주는가가 아니라 제삼? 그들은 똑같은 일을하고 있습니다.

+2

id는 속성이 없으므로 –

+1

을 확인하십시오. - http://qualitycoding.org/dot-notation/ –

+0

Objective-C를 구문 분석하는 의미가 그렇게 정의 되었기 때문입니다. 컴파일러는'id'에 임의의 메시지를 보낼 수 있지만 속성을 선언해야합니다. (다른 것들 중에서도 "선언 된"속성이라고하는 이유입니다). –

답변

1

주위에 논쟁이 있고, 특히 선언 된 속성이 도트 신택스를 사용하는 것에 대해 조언하기 전에 주위에 있던 프로그래머가 있습니다. 그러나 다른 언어와 마찬가지로 Obective-C도 진화했으며 올바른 방향으로 나아 갔다고 생각합니다. 이제 질문에 답하기 위해, 도트 신택스를 속성에 액세스하는 방법으로 생각할 수 있습니다. id에는 선언 된 속성이 없으므로 액세스하려고하면 컴파일 시간 오류가 발생합니다. 반면에 synthax 메서드를 사용하는 경우 런타임시 평가되는 수신기에 메시지를 보내는 것으로 생각하십시오. 따라서 컴파일 타임에 id에 메시지를 보내면 컴파일러는 사용자가 수행중인 작업과 수신자가 런타임에 메시지를 어떻게 든 처리한다는 것을 알고 있다고 가정합니다. 따라서이 차이점을 최대한 활용할 수 있습니다. 항상 점 표기법을 사용하지만 수신자가 메시지를 처리 ​​할 수 ​​있지만 컴파일러에서 알 수없는 경우 synthax 메서드를 사용합니다. (이 상황은 다소 희귀하지만 매우 중요합니다. Objective-C의 역 동성을 활용할 수 있습니다)

관련 문제