2012-01-06 2 views
9

나는 alloc이 클래스의 객체를 생성하고 클래스에 대한 "isa"포인터를 가리키며 런타임에 메시지가 어떻게 매핑되는지를 나타내는 클래스 메소드라는 것을 알고있다.목표 C에서 alloc은 어떻게 작동합니까?

및 allocWithZone 및 영역에 대한 몇 가지 아이디어가 있습니다.

는 사람이 말해 또는 설명하는 좋은 링크 날 포인트 : -

방법 ISA 포인터 권리 클래스 가리키는?

얼마나 많은 메모리가 할당됩니까?

상위 클래스에서 상속 된 멤버의 메모리는 어떻게 만들어 집니까?

id가 objc_object *의 typedef 인 경우 포인터가 가리키는 포인터는 무엇이며 객체를 보유하고있는 이유는 포인터가 메소드 선택기가있는 디스패치 테이블로 이동하기 때문에 우리에게 알려주는 것이므로 어떤 데이터 멤버가 거기에 있다고 가정합니까?

답변

8

컴파일러는 백그라운드에서 objc 런타임을 통해 호출을 삽입합니다. 포함 경로 objc/에서 라이브러리를 찾을 수 있습니다. objc/runtime.h가 가장 흥미로울 것입니다. 보너스로 몇 가지 일반적인 메시지는 objc_msgSend을 우회하여 이러한 삽입과 함께 선택합니다.

어떻게 포인터가 올바른 클래스를 가리 킵니까?

objc_constructInstance

얼마나 많은 메모리를 할당?

class_createInstance 
class_getInstanceSize 

어떻게 회원 메모리는 부모 클래스에서 만든 상속?

메모리가 0으로 설정되고 isa이 설정됩니다.

ID가 objc_object의 *에 대한 형식 정의가되면, 그것은 anyobject을 보유 않는 방법의 ISA 포인터 점을 무엇 ISA 포인터는 방법에 대한 선택기가 디스패치 테이블에 우리를 얻을 것이다 있기 때문에 그들은 말한다 아무것도 할 어떤 데이터 멤버들이 거기에 있다고 가정합니까?

초기화시 설정 한 값. ObjC 개체 포인터는 그냥 원시 메모리입니다.

MONDisplay * display = [NSString string]; 
NSLog(@"%@", display); 

포인터에 의해 반환 그냥 같은 값이 : 다음과 같은 구조의 메모리에 명시 적 유형 승격 또는 전환이없는 - 다른 언어와는 달리, 주조 및 서면 형태의 변환은 변수의 주소를 직접 세트입니다 [NSString string].

+1

'id' 포인터가 아닌 개체를 나타내는 유형, 그래서 그것은'ISA가없는 '자신의. 'id' 타입의 변수를 선언하면, 모든 타입의 객체에 포인터를 할당 할 수 있다는 것을 의미합니다. 컴파일러는 그것에 대해 불평하지 않습니다. 물론 객체 자체는 'isa'멤버를 가지고 있으며, 정의 상으로는 해당 객체가 인스턴스 인 클래스를 가리 킵니다. – Caleb

관련 문제