2012-02-20 2 views
2

Objective-C 런타임 작동 방식을 읽었으므로 뭔가 잘못 이해 한 경우 의견을주십시오.Objective-C 런타임 이해

Person이라고하는 클래스가 있다고 가정 해 보겠습니다. 이 클래스에는 getSex 메서드가있을 수도 있고 없을 수도 있습니다. 여기

Person *p = [[Person alloc]init]; 

메모리는 ISA (도 클래스 사람 가리키는 생성된다) 인 경우에 할당되고, 초기화는 사람 아이바의

[p getSex]; 
여기

objc_msgSend (사람, 선택기 @ (getSex을 초기화하는 데 사용)가 Person 클래스에서 호출 될 때 Person 클래스가 그러한 메소드를 가지고 있지 않으면 런타임은 Person 루트 클래스에서 그 메소드를 찾는다. 메소드가 발견되면 메소드 블록 코드에 대한 포인터 인 IMP가 호출된다. 실행 됨.

그게 맞습니까?

답변

2

예, init의 동작이 다른 멤버에게 알려지지 않는 한 속성을 초기화하는 것으로 추측하는 것이 합리적 일지라도 접근 자들이 유효한 결과를 반환하도록 모든 멤버 변수를 초기화하거나 초기화하지 않을 수도 있습니다.

+0

그들은 어떤 경우에도 유효하지만 반드시 유용한 것은 아니며 'alloc'에 의해 0으로 설정됩니다. –

+0

예, 그렇지만 잘 정의 된 것이 반드시 유효한 –

+0

즉. Person 인스턴스에 할당 된 메모리는 Person 클래스에 대한 포인터 만 보유합니다. – OhDoh

0

약간 꺼져있는 부분이 있습니다.

호출은 실제로이 세 가지 중 하나가 될 것입니다 : 여기

objc_msgSend(p, @selector(getSex)) 
objc_msgSend_fpret(p, @selector(getSex)) 
objc_msgSend_stret(p, @selector(getSex)) 

한 가지 차이점은 클래스에 첫 번째 인수는 개체에 있다는하지.

또한 getSex 메서드가 반환하는 내용을 공유하지 않았으므로 fpret/stret 버전 중 하나인지 여부를 알 수 없습니다. 메서드가 double (특정 플랫폼에서)을 반환하면 fpret 버전이 사용됩니다. 메서드가 특정 플랫폼에서 구조 값을 반환하면 stret 버전이 사용됩니다. 다른 모든 사람들은 표준 버전을 사용합니다. 이 모든 것은 다양한 방식으로 플랫폼에 의존합니다.

다른 말처럼 할당은 모든 인스턴스 변수가 0/NULL으로 설정되고 올바른 isa 포인터로 설정된 개체를 만듭니다. 초기화 메소드는 인스턴스 변수를 의미있는 것으로 업데이트하거나 업데이트하지 않을 수 있습니다.