Captain Hook 분석

976 단어
constructor/destructor
Objective-C는 결국 C 언어로 번역됩니다. 물론 constructor/destructor와 이 두 속성을 더한 함수는 각각 실행 가능한 파일(또는 shared library)load와 unload에서 호출됩니다. main() 함수 호출 전과return 후에 실행되는 것으로 이해할 수 있습니다.
실제로 constructor는 +load 이후에dyld(동적 링크기)가 처음에 objc runtime에 모든 클래스를 불러오라고 알렸기 때문에, 클래스를 불러올 때마다 +load가 호출되고, 모두 불러온 후에dyld는 모든constructor 방법을 호출합니다
CaptainHook도 이 원리를 이용하여 이루어진 것으로 다음과 같은 몇 가지 장점이 있다.
  • 모든 Class 로드 완료
  • main 함수 아직 실행 안 함
  • +load와 같이 한 Class에 쓰지 않아도 된다
  • __attribute__((constructor))
    static void beforeMain(void) {
        NSLog(@"beforeMain");
    }
    __attribute__((destructor))
    static void afterMain(void) {
        NSLog(@"afterMain");
    }
    int main(int argc, const char * argv[]) {
        NSLog(@"main");
        return 0;
    }
    
    

    여러 개의 constructor가 있고 우선순위를 제어하려면attribute((constructor(101))로 작성할 수 있습니다. 숫자가 작을수록 우선순위가 높고 1~100은 시스템에 보존됩니다.
    뭐가 잘못됐는지 댓글로 많이 올려주세요.

    좋은 웹페이지 즐겨찾기