2012-01-08 3 views
3

Objective C에서 모든 객체는 그 클래스가 속한 클래스를 알려주는 isa 포인터로 저장된 첫 번째 4 바이트 [프로세서 유형에 따라 다름]과 셀렉터를 해결하기 위해 사용할 디스패치 테이블이 기능.데이터 멤버는 개체에 어떻게 저장됩니까?

내가 알고 싶었던 것은 데이터 멤버가 이러한 메서드에서 저장되고 액세스되는 방식이었습니다. self는 호출되는 각 함수에서 암시 적 객체로 전달됩니다.

우리는 좋은 연습으로

을 다른 멤버 함수의 데이터 멤버를 처리하는 세터 N 게터를 사용하지만 우리가 직접 초기화 또는 accesor에 데이터 멤버를 참조 할 때, 방법은 그들이 액세스 할 수 있습니다. 컴파일시에 다른 주소로 바뀌 었습니까?

+0

분명히 Objective-C 런타임 (또는 그 일부/버전)은 오픈 소스입니다. ivars를 가져오고 설정하기위한 런타임 API가 여기 구현 된 방법을보실 수 있습니다 : http://www.opensource.apple.com/source/objc4/objc4-493.9/runtime/objc-class.m – millimoose

답변

3

실제로 afaik의 메모리 레이아웃은 구현에 따라 다르지만, http://algorithm.com.au/downloads/talks/objective-c-internals/objective-c-internals.pdf은 객체 데이터와 객체 메시징의 내부 작업에 대한 좋은 아이디어를 제공해야합니다.

직접 멤버 액세스를 사용할 때 기본적으로 발생하는 것은 실제 개체 인 "구조체"에서 직접 가져 오는 것입니다. 즉 컴파일러는 기본적으로 객체/struct의 주소에 오프셋을 추가하고 해당 메모리 주소의 내용을 읽는 것입니다.

아마도이 코드는 XCode에서 리버스 엔지니어링되어 있으며 찾을 수있는 사양에 쓰여지지 않았으므로이 동작에 따라 가장 좋은 아이디어라고 할 수 있습니다. iVars에 대한 외부 액세스는 허용되지 않으므로 기본적으로 컴파일러가 결정하며 언제든지 변경할 수 있습니다.

편집 : @FrederickCheung이 지적했듯이 Objective C 2.0이이 동작을 변경했을 수 있습니다.

+0

나는 그것을 추천 할 생각 이었지만 나는 그 질문에 대답한다고 생각하지 않는다. 이 프리젠 테이션을 통해 얻을 수있는 것은 객체가'struct' (내 생각은 너무 간단 함)이지만,'myVar = 2;는 구조체의 멤버 인 myVar를 어떻게 설정하는지 알 수 있습니까? –

+0

@ Paul.s * 정확하게 * 발생하는 것은 구현에 따라 다르며 디 컴파일 된 어셈블리 언어를 읽을 수 없으면 결정하기가 어려울 수 있습니다. 필드에 해당하는 ivars를 사용하여 런타임에 객체 인스턴스가 구조체 (포인터)로 표현되는 경우, ivar에 대한 할당은 해당 필드에 대한 할당을 가져 오게됩니다 (공용에 액세스 할 수 있기 때문에). C 코드에서 그런 식으로. – millimoose

+1

@ Paul.s 공식 문서는 이것에 대해 자세히 설명하지는 않고 단순히 인스턴스 메서드 정의에서 ivars에 액세스 할 수 있다고 명시합니다. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC /Chapters/ocDefiningClasses.html#//apple_ref/doc/uid/TP30001163-CH12-88468 – millimoose

2

적어도 64 비트 OS X 및 iOS 런타임에서는 객관적인 C 2.0이 아닌 컴파일 시간 오프셋 계산만큼 간단하지 않습니다. 이러한 것들은 우회 계층을 추가하여 이전 레이아웃에 대해 컴파일 된 하위 클래스를 손상시키지 않으면 서 인스턴스 변수 레이아웃을 변경하는 수퍼 클래스와 같은 기능을 지원합니다.

api docs은 인스턴스 변수를 설정하는 데 사용할 수있는 API를 설명하지만 구현에 대해서는 자세히 설명하지 않습니다.

관련 문제