当objc运行时本身加载?谁叫它加载?

时间:2013-10-29 08:11:58

标签: ios objective-c runtime

main()之前调用方法“ +(void)load ”,运行时将在程序之前加载内存中的所有类和方法开始,这是iOS应用程序的REAL入口点?谁和当运行时加载自己?

- - - - 修改 ----
找到了similar question

3 个答案:

答案 0 :(得分:1)

@ H2CO3给出了一个提示,这是objc运行时的源代码,我认为这是运行时开始加载的地方,由libSystem调用:

   /*
    * _objc_init  
    * Bootstrap initialization. Registers our image notifier with dyld.  
    * Old ABI: called by dyld as a library initializer  
    * New ABI: called by libSystem BEFORE library initialization time
    */

#if !__OBJC2__
 static __attribute__((constructor))
#endif
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();
    lock_init();
    exception_init();

    // Register for unmap first, in case some +load unmaps something
    _dyld_register_func_for_remove_image(&unmap_image);
    dyld_register_image_state_change_handler(dyld_image_state_bound,
                                             1/*batch*/, &map_images);
    dyld_register_image_state_change_handler(dyld_image_state_dependents_initialized, 0/*not batch*/, &load_images);
}

分享关于con / de structors的链接:http://gcc.gnu.org/onlinedocs/gccint/Initialization.html

答案 1 :(得分:0)

查看Mike Ash的文章Objective-C Class Loading and Initialization。您可以使用+ initialize方法而不是+ load。

  

+ load的一个有趣特性是它由运行时特殊引用,可以在实现它的类和主类中调用。这意味着如果在类中和类上的类中实现+加载,则将调用它们。这可能违背了你所知道的关于类别如何工作的所有内容,但这是因为+ load不是一种常规方法。这个特性意味着+ load是一个很好的地方,可以做出像方法一样的恶事。

     

对于大多数设置任务来说,+ initialize方法要好得多,因为它在懒惰的环境中运行。你可以从这里做任何你想做的事情,只要它不需要发生,直到某个外部实体向你的班级发消息。

答案 2 :(得分:0)

https://developer.apple.com/videos/play/wwdc2016/406/

此WWDC会话涵盖了您需要了解的内容,从阅读Mach O文件到在共享库中进行修复,以及在所有Objective-C类到+load的自下而上调用main()方法。

基本上一切都以exec()调用开始,然后dyld加载动态内容并通知Objective-C运行时。