// 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排序相關)