// eventType 入参表示函数对应触发的条件 // 定义一个全局函数,声明不被优化,存储到mach-o的section信息中 // 如下存储的参数名为(eventType连接Func),后期根据此名称取值 #define HF_Init_Func_For(eventType) static void HF_Func_##eventType(void); __attribute__((used, section("__DATA," ""#eventType "Func"))) static const void * __Func__##eventType = HF_Func_##eventType; static void HF_Func_##eventType(void)
定义一个待执行函数
HF_Init_Func_For(setup) { NSLog(@"这个是自定义的函数"); }
执行标记为setup条件下执行的函数
HF_Call_Func_For_([NSString stringWithFormat:@"%@Func",@"setup"]); int HF_Call_Func_For_(NSString *eventType) { Dl_info info; dladdr((const void *)&HF_Call_Func_For_, &info); struct mach_header_64 * machOHeader = (DTBaseMachHeader *)info.dli_fbase; uint64_t mach_header = (DTBaseType)info.dli_fbase; const struct section_64 * section = getsectbynamefromheader_64(machOHeader, "__DATA", eventType.UTF8String); if (section == NULL) { return -1; } size_t size = sizeof(void*); for (uint64_t add = mach_header + section->offset; add < mach_header + section->offset + section->size ; add += size) {
// 注意此处返回为指向函数指针(结构体、基本数据结构等)的指针值 void (**function)(void) = (void (**)(void))add; (*function)(); } return 0; }
以上该方式一个.m文件中只能有一个该类型函数,否则就是重复定义。执行顺序和编译相关(compile sources排序相关)