문제

Objective-C는 모든 메소드 호출에 동적 바인딩을 사용한다는 것을 알고 있습니다. 이것은 어떻게 구현됩니까? Objective-C는 컴파일하기 전에 "C 코드로 바뀌고 모든 것을 사용하는 (void*) 포인터를 사용합니까?

도움이 되었습니까?

해결책

개념적으로, 진행중인 일은 디스패처 라이브러리 (일반적으로 목표 C 런타임이라고 함)가 있으며 컴파일러는 다음과 같은 것을 변환한다는 것입니다.

[myObject myMethodWithArg:a andArg:b ];

~ 안으로

//Not exactly correct, but close enough for this
objc_msgSend(myObject, "myMethodWithArg:andArg:", a, b);

그런 다음 런타임은 모든 바인딩 및 파견을 처리하고 적절한 기능을 찾고 해당 Args를 호출합니다. 간단하게 해시 조회와 같은 종류를 생각할 수 있습니다. 물론 실제로는 훨씬 더 복잡합니다.

메소드 서명과 같은 것들과 관련된 문제가 훨씬 더 있습니다 (C는 유형을 인코딩하지 않으므로 런타임이 처리해야합니다).

다른 팁

각 목표 C 메소드는 "Hood Under the Hood"로 구현됩니다. 이 메소드에는 메시지와 관련된 메시지 (텍스트 문자열)가 있으며 클래스에는 메시지 문자열과 C 함수와 일치하는 조회 테이블이 있습니다. 따라서 Objective C 메소드를 호출 할 때 실제로 발생하는 일은 메시지 문자열을 객체에 보내고 객체는 클래스의 메소드 조회 테이블에서 관련 C 함수를 찾아 실행하는 것입니다.

객체가 메시지를 전달함으로써 이해하지 못하는 메시지를 처리하는 방법, 메소드 조회에서 메시지를 운반하는 방법 등과 같은 목표 C를 사용하여 더 많은 것이 있습니다. 그러나 이것이 기본입니다.

C ++는 메시지 테이블이있는 클래스 대신에 "vtable"이라는 다른 것을 가지고 있으며 텍스트 문자열을 통해가 아니라 vtable로 오프셋을 통해 메소드를 호출합니다. 이것은 정적 바인딩의 한 형태이며, 실행 속도를 약간 높이지만 동적 결합보다 유연성이 떨어집니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top