iOS启动任务管理

重新造轮子,写一个不阻塞启动过程的带优先级、依赖管理的启动任务管理器。

就目前iOS的客户端项目架构,组件化、面向接口基于IoC的模块化,越来越成为共识。模块的初始化、加载,及服务注册都需要合理地管理起来,同时要避免+load方法内预处理引入不必要的启动耗时。

目前一种可选的做法是,将任务/模块信息写入Mach-O的Section中,在合适时机读取使用。一般通过__attribute__((used, section("__DATA,")))即可将数据写入指定的Section。

1
2
3
4
5
6
7
8
9
typedef struct _ModuleClassEntry {
    const void *cls;
} ModuleClassEntry;

typedef struct _ModuleFuncEntry {
    const void *function;
    const char *fileName;
    const int line;
} ModuleFuncEntry

以上两种是常见的两种数据格式,前者好处在于简便,后者好处在于性能。

1
2
3
4
#define HOLORegisterStartUpTaskFunction_IMPL(FUNC_ID, ENTRY_ID) \
__attribute__((used, no_sanitize_address)) static void FUNC_ID();\
HOLO_MODULE_DATA_SECT(HOLOEntrySectionName) static const ModuleFuncEntry ENTRY_ID = (TTModuleFuncEntry){(void *)FUNC_ID, __FILE_NAME__, __LINE__};\
__attribute__((used, no_sanitize_address)) static void FUNC_ID

完善后将开源。

Comments