一次在项目中看见这样的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发现叫内联函数,当然static inline同常是成对出现的
static自不用多说,表示在当前文件中应用,如 static A,在其它文件中也可以出现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修饰的是函数,当然它们之间有区别,inline可以解决函数调用效率的问题:
函数之间调用,是内存地址之间的调用,当函数调用完毕之后还会返回原来函数执行的地址。函数调用有时间开销,内联函数就是为了解决这一问题
没有使用`static inline修饰的内联函数的mian函数汇编代码中,会出现 call 指令!这就是区别!调用call指令就是就需要:
- (1)将下一条指令的所在地址(即当时程序计数器PC的内容)入栈
- (2)并将子程序的起始地址送入PC(于是CPU的下一条指令就会转去执行子程序)。