我們知道一般的函數(shù)調(diào)用都會(huì)通過(guò)call的方式來(lái)調(diào)用,hacker很容易對(duì)一個(gè)函數(shù)做手腳,如果是以inline的方式編譯的,會(huì)把該函數(shù)的code拷貝到每次調(diào)用該函數(shù)的地方;而static會(huì)讓生成的二進(jìn)制文件中沒(méi)有清晰的符號(hào)表,讓逆向的人很難弄清楚邏輯
static int isValidate(int id) __attribute__ ((always_inline));
static inline int isValidate(int id);
定義:有函數(shù)的結(jié)構(gòu),但不具備函數(shù)的性質(zhì),類(lèi)似于宏替換。代碼中使用inline定義,能否形成內(nèi)聯(lián)函數(shù),還要看編譯器對(duì)內(nèi)聯(lián)函數(shù)體內(nèi)部的定義的具體處理
1.使用inline
修飾的函數(shù),在編譯的時(shí)候,會(huì)把代碼直接嵌入調(diào)用代碼中。就相當(dāng)于用#define 宏定義來(lái)定義一個(gè)add 函數(shù)那樣!與#define的區(qū)別是:
1)#define定義的格式要有要求,而使用inline則就行平常寫(xiě)函數(shù)那樣,只要加上inline即可!
2)使用#define宏定義的代碼,編譯器不會(huì)對(duì)其進(jìn)行參數(shù)有效性檢查,僅僅只是對(duì)符號(hào)表進(jìn)行替換。
3#define宏定義的代碼,其返回值不能被強(qiáng)制轉(zhuǎn)換成可轉(zhuǎn)換的適合的轉(zhuǎn)換類(lèi)型。
2.在inline加上static修飾符
只是為了表明該函數(shù)只在該文件中可見(jiàn)!也就是說(shuō),在同一個(gè)工程中,就算在其他文件中也出現(xiàn)同名、同參數(shù)的函數(shù)也不會(huì)引起函數(shù)重復(fù)定義的錯(cuò)誤
注意點(diǎn):
1.查看main.m的匯編文件:
選中main.m文件-->Xcode 菜單 --> Product --> Perform Action --> Assemble "main.m"
2.不能使用循環(huán)語(yǔ)句;不能使用開(kāi)關(guān)語(yǔ)句;不能使用遞歸調(diào)用;定義在第一次調(diào)用之前