2017-12-30 11 views
1
Fraction* myFraction=[Fraction new]; 
[myFraction method]; 

myFraction은 메모리 주소가 할당 된 포인터입니다. myFraction의 방법을 사용하는 경우, 그것은 당신이 실제로 목표 - C 객체에 함수를 호출하지 않는 것을 의미한다, 당신은 대신 C. 생각하고목표 -C에서 포인터를 이해하는 방법

+1

아니, 안. Objective-C는 대괄호 호출 구문을 사용할 때 포인터의 역 참조를 처리합니다. – dasblinkenlight

+0

일반적으로 Objective C 객체를 참조하는 포인터는 절대로 명시 적으로 참조 해제되지 않습니다. – clemens

+0

@ dasblinkenlight 감사합니다! –

답변

3

은, 오브젝티브 C가 실제로 동적으로 전달됩니다? * myFraction을 사용할 수 없습니다 . 오히려 인스턴스에 "메시지를 보냅니다". Objective-C 런타임은 해당 메시지의 실제 변환을 C 함수 호출로 처리합니다.

예에서 [myFraction method]은 실제로 objc_msgSend(myFraction, @selector(method))과 비슷한 것으로 컴파일됩니다.

objc_msgSend() 기능은 Objective-C의 핵심입니다. 지원되는 플랫폼마다 손이 written in assembly입니다. 이 어셈블리 호출 내에서 런타임은 인스턴스의 유형 (이 경우에는 Fraction)을 결정하고 프랙 션 클래스의 알려진 인스턴스 메소드를 검색합니다. 메소드가 발견되지 않으면 Fraction의 수퍼 클래스를 루트 (NSObject)까지 검색합니다.

-[Fraction method]에 해당하는 C 함수가 확인되면 objc_msgSend이 호출합니다.

흥미롭게도 결과 C 함수 호출에는 실제로 두 개의 추가 인수 (myFraction 포인터 및 원래 메서드 선택기)가 제공됩니다. 이 코드는 -[Fraction method]에 작성한 코드를 실행하기 전에 제거하고 self_cmd에 저장합니다. 인스턴스 상태가 인스턴스 함수로 전달되는 방법입니다.

일부 읽기 : 정말 멋진 :

https://www.mikeash.com/pyblog/friday-qa-2012-11-16-lets-build-objc_msgsend.html

+0

먼저, 도와 주셔서 감사합니다. 하지만 저의 가난한 영어를 용서해주십시오 ... 나는 그들 중 일부만을 이해할 수 있습니다. 답으로부터 OC는 C와는 다르다. 나는 단지 C와 같은 함수를 호출하지 않고 내 인스턴스에 메시지를 보낸다. 그래서 포인터 문제를 생각할 필요가 없다. 그게 맞습니까? –

+1

제가 대체로 맞습니다. Objective-C는 C의 맨 위에 구축됩니다.'myFraction'은 C 포인터입니다! 그러나'[myFraction ...] '형식을 사용하면 컴파일러는이를 C 호환 코드로 변경합니다. –

+0

안녕하세요? @ RanJi,이 대답이 도움이된다면, "Accepted"로 표시 하시겠습니까? –