9, el IOS inferior Análisis - la carga de la clase

inicia el programa

  1. biblioteca estática se compila directamente en el programa
    1. DLL se añade dinámicamente cuando sea necesario, dyld es una biblioteca de vínculos dinámicos
    2. dyld es enlazador dinámico de Apple, cada programa depende de las bibliotecas dinámicas son requeridos por dyld (ubicado en / usr / lib / dyld) uno por uno, cargado en la memoria. El archivo de imagen se carga
    3. Si el tiempo de ejecución de cada programa se repite la carga, se producirá inevitablemente lento, con el fin de optimizar los tiempos de arranque y mejorar el rendimiento del programa, se utiliza un mecanismo de memoria caché compartida. Todas las bibliotecas de enlace dinámico predeterminado se combinan en un archivo de caché de gran tamaño en el directorio bajo /System/Library/Caches/com.apple.dyld/ se salvaron de la trama
    4. En el interior hay dyld_shared_cache_armv7s tales como el iPhone y dyld_shared_cache_armv64 dos archivos, como se muestra a continuación.
    1. objc_init
      1. Proporciona el entorno de ejecución
      2. Después se inicia el programa de dyld cómo objc_init de?
        1. biblioteca del sistema de inicialización recursiva (bibliotecas del sistema)
        2. despacho (programación)
        3. objc -> objc_init
        4. objc_init el mapeo, los datos de los mapas en el archivo de imagen para trazar mesa
  2. imágenes 
    1. dyld comunicación con objc_init
    2. El archivo de imagen sólo en el dyld
    3. objc_init dependientes archivos de imagen
  3. función de devolución
    1. * snotif
    2. registro
    3. puntero
  4. Cargar imágenes
    1. Almacenados en la memoria con la tabla (almacenado en la memoria en forma de una forma de agregado, forma de tabla tabla, mapa)
    2. archivo de imagen para ser leída - mantener en la memoria
      1. ¿Qué datos se leen?
      2. Binary (tipo, protocolo, clasificación, sel)

 

carga de clases

_objc_init

  1. Después de que el programa en el inicio, la dyld primera librería de enlace dinámico utilizado, de terminar una serie de operaciones de preparación, entrará en _objc_init método
  2. /***********************************************************************
    * _objc_init
    * Bootstrap initialization. Registers our image notifier with dyld.
    * Called by libSystem BEFORE library initialization time
    **********************************************************************/
    
    void _objc_init(void)
    {
        static bool initialized = false;
        if (initialized) return;
        initialized = true;
        
        // fixme defer initialization until an objc-using image is found?
        environ_init();   //读取环境变量
        tls_init();       //关于线程key的绑定
        static_init();    //系统级别的类,在这里进行初始化
        lock_init();      //是空实现!!这个方法里面什么都没写
        exception_init(); //初始化libobic的异常处理系统
    
        _dyld_objc_notify_register(&map_images, load_images, unmap_image); //注册处理程序,以便在映射,取消映射和初始化objc图像是调用。
    }
    

     

1, environ_init

  1. Lectura de las variables ambientales afectan el tiempo de operación de la terminal de exportación puede entrar en OBJC_HELP = 1 para imprimir las variables de entorno ayuda
  2. objc[3206]: Objective-C runtime debugging. Set variable=YES to enable.
    objc[3206]: OBJC_HELP: describe available environment variables
    objc[3206]: OBJC_PRINT_OPTIONS: list which options are set
    objc[3206]: OBJC_PRINT_IMAGES: log image and library names as they are loaded
    objc[3206]: OBJC_PRINT_IMAGE_TIMES: measure duration of image loading steps
    objc[3206]: OBJC_PRINT_LOAD_METHODS: log calls to class and category +load methods
    objc[3206]: OBJC_PRINT_INITIALIZE_METHODS: log calls to class +initialize methods
    objc[3206]: OBJC_PRINT_RESOLVED_METHODS: log methods created by +resolveClassMethod: and +resolveInstanceMethod:
    objc[3206]: OBJC_PRINT_CLASS_SETUP: log progress of class and category setup
    objc[3206]: OBJC_PRINT_PROTOCOL_SETUP: log progress of protocol setup
    objc[3206]: OBJC_PRINT_IVAR_SETUP: log processing of non-fragile ivars
    objc[3206]: OBJC_PRINT_VTABLE_SETUP: log processing of class vtables
    objc[3206]: OBJC_PRINT_VTABLE_IMAGES: print vtable images showing overridden methods
    objc[3206]: OBJC_PRINT_CACHE_SETUP: log processing of method caches
    
    

     

2, tls_init ()

  1. Encuadernación hilo en clave - por ejemplo, el número de hilos por destructor
  2. Destructor: destructor (destructor) y el constructor contraste, cuando el extremo objeto de su ciclo de vida , tales como cuando el objeto función se ha invocado una vez terminado, el sistema realiza automáticamente el destructor. Los destructores se utilizan a menudo para hacer "limpiar las secuelas de" trabajo (por ejemplo, al crear un nuevo objeto se abre un espacio de memoria, llamada de borrar el destructor se libera automáticamente después de memoria).

3, static_init ()

  1. constructor estático de ejecución de C ++. Antes de llamar a nuestro dyld constructor estático, "libc" se llame "_objc_init ()", por lo que tenemos que hacer usted mismo.
  2. Este lugar que algunos dyld (_dyld_objc_notify_register) hacia adelante, porque este es un nivel de sistema, se debe inicializar adelante que dyld
  3. Se trata de un sistema de clases de nivel, donde inicializados. libc dyld llamada _objc_init antes de llamar al constructor estático (),
  4. /***********************************************************************
    * static_init
    * Run C++ static constructor functions.
    * libc calls _objc_init() before dyld would call our static constructors, 
    libc在dyld调用静态构造函数之前调用_objc_init(),
    * so we have to do it ourselves.
    **********************************************************************/
    static void static_init()
    {
        size_t count;
        auto inits = getLibobjcInitializers(&_mh_dylib_header, &count);
        for (size_t i = 0; i < count; i++) {
            inits[i]();
        }
    }

     

4, lock_init ()

  1. Esa única excepción objc es el billete de banco con un conjunto de C ++ que - es en sí mismo escrito en C ++
  2. La realización está vacía! ! Este método no es nada escrito en su interior

5, _dyld_objc_notify_register

condiciones que anteceden son listos , _dyld_objc_notify_register , anotaciones se conocen por el método utilizado para sólo sólo en tiempo de ejecución objc, por map_images y load_images

_dyld_objc_notify_register (y map_images, load_images, unmap_images)

  1. Utilice plazo sólo objc, objc aquí es un entorno de tiempo de ejecución
  2. El registro de un controlador para el mapeo, la cartografía y la inicialización cancelado imagen objc se llama.
  3. devolución de llamada dyld va a utilizar una gran variedad de archivo de imagen contiene objc_image_info función "asignada"
  4. map_images
    1. Lee el archivo de imagen
  5. cargar imágenes
  6. unmap_image
    1. la terminación del programa, anormal, deshacerse de una parte del archivo de imagen de la memoria

 

 

Sin terminar. . . seguido

 

 

 

 

 

 

 

 

Publicado 83 artículos originales · ganado elogios 12 · vistas 180 000 +

Supongo que te gusta

Origin blog.csdn.net/shengdaVolleyball/article/details/104068747
Recomendado
Clasificación