기사 디렉토리
앱 시작 프로세스
콜드 스타트와 웜 스타트
콜드 스타트: 시작할 때 앱 프로세스가 시스템에 없으며 새 프로세스를 시작해야 합니다.
핫 스타트: 시작 시 앱 프로세스는 여전히 시스템에 있으므로 새 프로세스를 시작할 필요가 없습니다.
APP 완료 시작 프로세스
주로 세 단계로 나뉩니다.
main()
함수 실행 전(pre-main
단계)main()
기능 실행 후(main
기능 실행부터 설정self.window.rootViewController
실행 완료까지)- 첫 번째 화면 랜더링 완료 후(
self.window.rootViewController
실행 완료부터didFinishLaunchWithOptions
메소드 범위 종료까지)
1. 메인 기능이 실행되기 전에 시스템이 수행할 작업:
- 실행 파일을 로드합니다. (앱의 모든 .o 파일)
- 동적 링크 라이브러리를 로드하고 리베이스 포인터 조정을 수행하고 심볼 바인딩을 바인드합니다.
- ObjC 런타임 초기화. 포함 : ObjC 관련 클래스 등록, 카테고리 등록, 선택자 고유성 검사 등
- 초기화. 포함: +load() 메서드 실행, attribute((생성자))로 장식된 함수 호출, C++ 정적 전역 변수 만들기 등
앱이 시작되면 먼저 시스템 커널(Kernel)이 프로세스를 생성합니다.
둘째, 실행 파일을 로드합니다. (실행 파일은 Mach-O 형식의 파일, 즉 App에 있는 모든 .o 파일의 집합을 말합니다.) 이때 dyld(dyld는 Apple의 동적 링커)의 경로를 얻을 수 있습니다.
그런 다음 주로 4단계로 구분되는 dyld를 로드합니다.
1. dylibs 로드: 이 단계에서 dyld는 애플리케이션이 의존하는 dylib를 분석하고 mach-o 파일을 찾고 이 파일을 열어 읽고 유효성을 확인합니다. 그런 다음 코드를 찾으십시오 서명이 커널에 등록되고 마지막으로 mmap()이 dylib의 각 세그먼트에 대해 호출됩니다.
2. 리베이스/바인딩: 리베이스 포인터 조정을 수행하고 심볼 바인딩을 바인드합니다.
3. ObjC 설정: 런타임 초기화. ObjC 관련 클래스 등록, 카테고리 등록, 선택자 고유성 검사 등 포함
4. 이니셜라이저: 각 ObjC 클래스 및 분류의 +load 메서드를 호출하고 속성((생성자))으로 수정된 함수를 호출하고 C++ 정적 전역 변수를 생성합니다.
2. main 함수가 실행된 후:
주 기능 실행 후 단계는 주 기능 실행부터 appDelegate의 didFinishLaunchingWithOptions 메소드 중 첫 화면 렌더링 관련 메소드 완료까지를 말합니다.
즉, main 함수 실행부터 self.window.rootViewController 설정 완료까지입니다.
3. 첫 번째 화면 렌더링이 완료된 후:
첫 번째 화면 렌더링이 완료된 후 단계는 첫 번째 화면 렌더링 후 모든 메서드 실행이 didFinishLaunchingWithOptions
메서드 범위 내에서 실행됨을 의미합니다. 즉, 설정에서 메소드 범위 종료 까지 .self.window.rootViewController
didFinishLaunchWithOptions
이 단계에서 첫 번째 화면이 렌더링되었습니다.
해야 할 일:
- 첫 화면 표시에 필요하지 않은 일부 기능을 초기화합니다.
- 메인 스레드를 최적화하고 메인 스레드를 먼저 차단하는 방법을 처리하여 사용자의 후속 작업에 영향을 미치지 않도록 합니다.
마하오
mach-o
iOS/macOS
바이너리 파일의 형식 이며 mach-o
여러 가지 유형으로 나뉩니다. 이 문서에서는 일반적인 mach-o
파일 형식과 차이점에 대해 설명합니다.
에서는 Xcode->Build Setting ->Mach-O Type
다음 유형 중에서 선택할 수 있습니다.
Executable
(제품은 ipa 패키지입니다)Dynamic Library
(제품은 동적 라이브러리입니다)Bundle
(상품은 번들 파일입니다)Static Library
(제품은 정적 라이브러리입니다)Relocatable Object File
(리디렉션 파일)
컴파일 및 링크 프로세스: 【iOS】——컴파일 및 링크