방법 실행 과정에서rumtine/message 메커니즘 보기
간단한 소개
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 doSomething]
이라는 코드가 실행되기 전에(꼭 전에 주의해야 한다)dog의 이사 지침의 지향을 Cat
형식으로 바꾸면 이 메시지를 처리하는 대상은 Dog 형식이 아니라Cat 형식이다.OC에서 KVO는 이런 방식으로 이루어진 것이다. 내 글에서 KVO의 원리를 보면 밑바닥이 이루어진다.objc_method_list
, 이 목록에는 SEL이 저장되어 있다. 즉, 방법 이름에 해당하는 방법의id라고 할 수 있다. 이 시스템은 class 중 objc_method_list
에 doSomething
이 있는지, 없으면 슈퍼클래스의 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]
의 최종 결과는 dog
이 eat
의 실현을 집행한 것이다.method_exchangeImplementations
이 함수는 바로 이런 방식을 통해 방법을 교환하는 것이다.위에서 보듯이 한 문장의 번역 단계의
[dog doSomething]
은 기본적으로 어떤 것도 결정할 수 없다. 상기 운행 과정에서 어떤 것들을 마음대로 바꾸면 [dog doSomething]
의'면목이 완전히 비뚤어진다'.이것도 럼티미가 강한 곳이야.쓸모 있는 원숭이 친구들 좋아요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.