방법 실행 과정에서rumtine/message 메커니즘 보기

2519 단어

간단한 소개


Objective-C는 애플 소프트웨어를 개발하는 언어로 대부분 C 언어이다.일부 기본적인 특성을 제외하고 가장 중요한 것은 동적 언어이다. 그 동적 기반은 바로rumtime, 즉 운행시 메커니즘이다.OC가 실행되지 않았을 때 매력이 없어졌다고 할 수 있다.

메시지 메커니즘


정적 언어에 대해 집행 방법이 비교적 융통성이 없어 보이기 때문에 방법명은 이번 방법의 집행의 모든 요소를 결정할 수 있지만 메시지 분배 메커니즘에 있어 매우 유연하다.컴파일 단계는 모든 것이 미정이고 대상이 처리할 수 있는지, 최종적으로 어느 대상이 처리될지, 최종적으로 호출되는 방법의 실현이 무엇인지도 모른다. 이 모든 것은 운행할 때 결정된다.
다음은 우리가 방법이 호출되는 전체 과정을 상세하게 분석해 보겠다
- (void)viewDidLoad {
    [super viewDidLoad];

    Dog *dog = [[Dog alloc] init];
    [dog doSomething];
}

[dog doSomething]

  • [dog doSomething] 뭐 했어요?컴파일러는 [dog doSomething] ---> objc_msgSend(dog, @selector(doSomething))
  • objc_msgSend(dog, @selector(doSomething)) 뭐 했어요?이 슬라이드에서는 다음을 중점적으로 다룹니다.
  • 에서 Dog이 어떤 유형의 대상인지 검사한다. 즉, Dog의 Class를 찾는다. OC 대상 자체에 이사 구성원이 있다. 이 이사는 대상의 유형을 결정한다. 즉, 이사 지침이 가리키는 Class는dog의 실제 유형이고 어떤 유형의 지침으로 이 대상을 받아들이든 상관없다. 이것은 다태적인 기초이다.
  • 이 단계에서 할 수 있는 방법: [dog doSomething]이라는 코드가 실행되기 전에(꼭 전에 주의해야 한다)dog의 이사 지침의 지향을 Cat 형식으로 바꾸면 이 메시지를 처리하는 대상은 Dog 형식이 아니라Cat 형식이다.OC에서 KVO는 이런 방식으로 이루어진 것이다. 내 글에서 KVO의 원리를 보면 밑바닥이 이루어진다.
  • OC에서 class 유지 보수 방법 목록 objc_method_list, 이 목록에는 SEL이 저장되어 있다. 즉, 방법 이름에 해당하는 방법의id라고 할 수 있다. 이 시스템은 class 중 objc_method_listdoSomething이 있는지, 없으면 슈퍼클래스의 objc_method_list을 찾아낸다.
  • 이 단계에서 할 수 있는 수법: 같은 이치로 이 단계에 앞서 현저한 doSomething 방법의 성명과 실현이 없어도 class_addMethod을 이용하여 doSomething 방법을 동태적으로 추가하면 된다.그러나 번역이 통과될 수 있도록 performSelector과 관련된 방법을 사용해야 한다.
  • 에서 doSomething이라는 SEL을 찾으면 시스템이 호출됩니다. 이 SEL은 시스템이 최종적으로 실행하는 코드가 무엇인지를 결정할 수 없습니다. 결정자는 SEL과 映射 관계가 있는 IMP입니다. 간단하게 말하면 모든 SEL은 사전의 키에 해당하고 이 키가 대응하는value가 진정으로 방법의 실현을 결정합니다. 이 단계는 시스템이 SEL을 통해 이value를 찾을 뿐입니다. 이value는 IMP이고 IMP는 함수 바늘입니다.지시 방법의 실현을 가리키며 IMP는 최종적으로 어떤 코드를 호출할지 결정한다.
  • 이 단계에서 할 수 있는 수법: 함수를 집행하기 전에 doSomething이라는 SEL에 대응하는 IMP를 다른 방법인 eat의 IMP로 바꾸면 이 [dog doSomething]의 최종 결과는 dogeat의 실현을 집행한 것이다.method_exchangeImplementations 이 함수는 바로 이런 방식을 통해 방법을 교환하는 것이다.


  • 위에서 보듯이 한 문장의 번역 단계의 [dog doSomething]은 기본적으로 어떤 것도 결정할 수 없다. 상기 운행 과정에서 어떤 것들을 마음대로 바꾸면 [dog doSomething]의'면목이 완전히 비뚤어진다'.이것도 럼티미가 강한 곳이야.
    쓸모 있는 원숭이 친구들 좋아요!

    좋은 웹페이지 즐겨찾기