속성 구문을 사용하는 컴파일은 컴파일 타임에 수신기 유형을 알아야합니다. 내가 뭔가를 이해하지 못할 수도 있지만 Objective-C가 동적 인 언어라는 점을 감안할 때 이것은 깨진 또는 불완전한 컴파일러 구현처럼 보입니다.컴파일 할 때 속성에 명시 적으로 타이핑해야하는 이유는 무엇입니까?
속성 "주석이"로 정의됩니다
@property (nonatomic, retain) NSString *comment;
및 합성 :
"문서"에 부합 몇 가지 클래스 중 하나의 인스턴스입니다 :
@protocol DocumentComment <NSObject>
@property (nonatomic, retain) NSString *comment;
@end
은
으로 간단히 표시됩니다.
,id document;
다음 속성 신택스를 사용하는 경우 :
stringObject = document.comment;
다음 에러가 GCC에 의해 생성된다 : 그러나
error: request for member 'comment' in something not a structure or union
다음 동등한 수신기 방식의 구문, 경고 또는 에러없이 컴파일 런타임에 예상대로 잘 작동합니다.
stringObject = [document comment];
왜 등록 정보에서 컴파일 타임에 수신자 유형을 알아야하는지 이해할 수 없습니다. 제가 누락 된 것이 있습니까? 수신 객체가 동적 유형을 갖는 상황에서 오류를 피하기 위해 후자의 구문을 사용하기 만합니다. 반쯤 구운 것 같습니다.
하지만 런타임에는 문서의 실제 유형을 알지 못하지만 표준 수신기 방법 구문을 사용하여 성공합니다. 이것은 역동적 인 언어입니다. 물론 document.comment 속성은 사용자가 제공 한 속성 선언과 함께 실패하므로 완벽한 의미를 갖습니다.컴파일러는 리시버 메소드 구문 예제와 동일한 정보 부족을 가지고 있지만 컴파일러는 그대로 사용합니다. 존재하지 않는 메서드 이름을 사용할 수 있으며 컴파일러는이를 그대로 둡니다. – ctpenrose
컴파일은 객체에 -comment라는 메서드가 어딘가에 있다는 것을 알면 불만없이'[document comment]'만을 받아 들일 것입니다. '[document sdlkjf]'라고 입력하면 경고 메시지가 나타납니다. 그러나 당신은 정확합니다. 동적 디스패치를 사용하는 메소드는 객체가 실제로 그 메시지를 처리하지 않으면 런타임에 만 실패합니다. 반면에 속성은 컴파일 타임 기능이므로 속성 액세스는 컴파일 타임에 해결됩니다. –
... 만약'NSString *', 하나의'char *'그리고 하나의 구조체를 반환하는 3 개의'comment' 메소드가 있다면, 모든 다이내믹은 어쨌든 창 밖으로 나옵니다. 현실은 Objective-C가 정적 디스패치 또는 다형성 방식으로 정적 유형 지정을받지 않고 정적으로 형식이 지정된 언어라는 사실입니다. – bbum