在 main()之前调用方法“ +(void)load ”,运行时将在程序之前加载内存中的所有类和方法开始,这是iOS应用程序的REAL入口点?谁和当运行时加载自己?
- - - - 修改 ----
找到了similar question
答案 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运行时。