1

方法“ + (void)load ”在main()之前被调用,运行时会在程序启动之前加载内存中的所有类和方法,那么哪个是 iOS 应用程序的真正入口点?以及运行时加载自己的人和时间?

-----编辑----
发现了一个类似的问题

4

3 回答 3

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 构造函数的链接:http: //gcc.gnu.org/onlinedocs/gccint/Initialization.html

于 2013-10-29T11:17:30.107 回答
0

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

+load 的一个有趣特性是它是由运行时特例在实现它的类别和主类中调用的。这意味着如果您在一个类和该类的一个类别中实现 +load,两者都会被调用。这可能与您所知道的关于类别如何工作的一切背道而驰,但那是因为 +load 不是一种正常的方法。这个特性意味着 +load 是一个很好的地方来做一些邪恶的事情,比如方法混合。

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

于 2013-10-29T08:34:06.580 回答
0

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

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

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

于 2016-06-21T12:48:58.150 回答