一次在項目中看見這樣的code
CG_INLINE void POST_NOTIFICATION(NSString *name, id object, NSDictionary *userInfo){
[[NSNotificationCenter defaultCenter] postNotificationName:name object:object userInfo:userInfo];
}
# define CG_INLINE static inline
搜索一下inline發(fā)現(xiàn)叫內(nèi)聯(lián)函數(shù),當然static inline同常是成對出現(xiàn)的
static自不用多說唱逢,表示在當前文件中應用,如 static A,在其它文件中也可以出現(xiàn)static A不會導致重名的錯誤配喳。
作用:
1.替代宏 查看一下YYKit
static inline CGFloat CGFloatFromPixel(CGFloat value) {
return value / YYScreenScale();
}
//YYScreenScale()方法說明:
CGFloat YYScreenScale() {
static CGFloat scale;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
scale = [UIScreen mainScreen].scale;
});
return scale;
}
static inline修飾的是函數(shù)憔狞,當然它們之間有區(qū)別,inline可以解決函數(shù)調(diào)用效率的問題:
函數(shù)之間調(diào)用,是內(nèi)存地址之間的調(diào)用椭迎,當函數(shù)調(diào)用完畢之后還會返回原來函數(shù)執(zhí)行的地址锐帜。函數(shù)調(diào)用有時間開銷,內(nèi)聯(lián)函數(shù)就是為了解決這一問題
沒有使用`static inline修飾的內(nèi)聯(lián)函數(shù)的mian函數(shù)匯編代碼中侠碧,會出現(xiàn) call 指令抹估!這就是區(qū)別!調(diào)用call指令就是就需要:
- (1)將下一條指令的所在地址(即當時程序計數(shù)器PC的內(nèi)容)入棧
- (2)并將子程序的起始地址送入PC(于是CPU的下一條指令就會轉去執(zhí)行子程序)弄兜。