2017-04-26 4 views
1

Objective-C 런타임을 이해하려고하는데 포인터가 가리키는 곳이 self 인 곳을 알아 내지 못합니다. 나는 &self이 무엇을 보여줄지를 보여주는 예제를 썼다. 주소 및 셀프 포인트?

@implementation ClassA 
    -(void) print { 
     NSLog(@"Class A &self is: %p", &self); 
    } 
@end 

가 그럼 난 main()에서 A의 두 인스턴스를 생성하고 인쇄 할 printf() 전화 : 아래 그림과 같이 나는 ClassA를 작성했습니다

ClassA *firstInstance = [ClassA new]; 
[firstInstance print]; 

ClassA *secondInstance = [ClassA new]; 
[secondInstance print]; 

를 그리고 두 경우 모두에 대해 동일한 주소를 얻을 :

Class A &self is: 0x7fff5bacf4e8 
Class A &self is: 0x7fff5bacf4e8 

은 더욱 나는 다음 코드를 사용하여 두 번째 클래스를 만들 때 :

@implementation ClassA 
-(void) print { 
    NSLog(@"Class B &self is: %p", &self); 
} 
@end 

동일한 주소가 &self에 있습니다.

Class B &self is: 0x7fff5bacf4e8 

왜 항상 &self은 같은 주소를 가리 킵니까?

답변

2

self 메시지를 수신 한 개체를 가리 킵니다. 그러나 self을 인쇄하지 마십시오. &self 포인터는 에서self까지이며 self은 가리 키지 않습니다. self 이후

&self -> self -> object 

가 자동으로 모든 메소드에 전달됩니다, 당신은 단순히 관계없이 인스턴스 항상 귀하의 경우 동일 스택에 인수의 주소를 인쇄하거나 self 점을 입력합니다.

주소를 인쇄하려면 self이 가리 키려면 & 만 삭제하면됩니다.

+1

이 경우에도 이런 경우가 발생하는 이유는 '-print'_ 실행시 스택의'self '주소를 사용하기 때문입니다. '-print'를 호출하면 스택에 새로운 스택 프레임이 푸시되고, 그 위에'self'가 놓입니다. '& self! = & a! = &b';'a'와'b'는 다른 스택 위치에 있지만'self'도 스택 위치와 별개입니다. 다른 함수 안에서'-print'를 호출했다면,'& self'는 여전히 달라질 것입니다. –

+0

OP가 이것을 원하지 않는다면, 주목할만한 가치가 있는지, 왜 특정한 방식으로 발생하는지, 나도 몰라요. 조금도. ;-) –

+0

물론 교육을 위해서 ... OP가 아닌 사람이이 질문에 비틀 거리고 궁금해 할 수 있습니다. 하지만, 내 의견과 왜 내가 의견이나 편집이나 다른 대답이 아니라 추론을 떠난. :) –

1

모든 방법에서 self은 숨겨진 매개 변수입니다. 함수의 매개 변수는 지역 변수이므로, -print은 그 자체의 특정 호출에서 자체 로컬 변수의 주소를 간단히 출력합니다. 그것은 호출 된 객체와 아무 관련이 없습니다.

예에서 동일한 함수에서 서로 직선으로 호출하는 두 가지 호출은 같은 호출을하기 때문에 동일한 호출이 새 스택 프레임을 (동일한) 현재 스택 프레임 위에 배치하고 -print의 스택 프레임에있는 로컬 변수 self은 고정되어 있으므로 위치는 동일합니다.