『ios』篇简介NS_INLINE内联函数
2018-08-28 本文已影响5人
butterflyer
在.h文件这么搞
NS_INLINE是什么意思呢?
image.png
NS_INLINE JSConfig * jsConfig(NSString *tagName, NSString *classList, NSString *style) {
JSConfig *config = [[JSConfig alloc] init];
config.tagName = tagName;
config.classList = classList;
config.style = style;
return config;
}
通过查阅资料,发现他叫内联函数。
我先举个应用的例子
#import <Foundation/Foundation.h>
NS_INLINE void tipWithMessage(NSString *message){
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:nil cancelButtonTitle:nil otherButtonTitles:nil, nil];
[alerView show];
[alerView performSelector:@selector(dismissWithClickedButtonIndex:animated:) withObject:@[@0, @1] afterDelay:0.9];
});
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
tipWithMessage(@"世界,你好!");
}
说下搜过资料后自己的理解,通俗一点讲,就是为了解决宏相互嵌套所引起的问题。
比如
#define Kmax(a, b) (a) > (b) ? (a) : (b)
调用
int result = Kmax(i, j) + 2 ;
那么现在会变成什么?
result = (i) > (j) ? (i) : (j) + 2 ;
实际上我们需要的是
result =( (i) > (j) ? (i) : (j) )+ 2 ;
所以内联函数就是来解决这些问题的。
内联函数可以直接写在pch文件中来引用,差不多宏能干的是他都能干。
下面看些深入的点东西,某位大神总结的。拿来借用下。
内联函数作用:
函数之间调用,是内存地址之间的调用,当函数调用完毕之后还会返回原来函数执行的地址。函数调用有时间开销,内联函数就是为了解决这一问题。
不用inline修饰的函数, 汇编时会出现 call 指令.调用call指令就是就需要:
(1)将下一条指令的所在地址入栈
(2)并将子程序的起始地址送入PC(于是CPU的下一条指令就会转去执行子程序).
为什么inline能取代宏?
优点相比于函数:
1) inline函数避免了普通函数的,在汇编时必须调用call的缺点:取消了函数的参数压栈,减少了调用的开销,提高效率.所以执行速度确比一般函数的执行速度要快.
2)集成了宏的优点,使用时直接用代码替换(像宏一样);
优点相比于宏:
1)避免了宏的缺点:需要预编译.因为inline内联函数也是函数,不需要预编译.
2)编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。
3)可以使用所在类的保护成员及私有成员。
inline内联函数的说明
1.内联函数只是我们向编译器提供的申请,编译器不一定采取inline形式调用函数.
2.内联函数不能承载大量的代码.如果内联函数的函数体过大,编译器会自动放弃内联.
3.内联函数内不允许使用循环语句或开关语句.
4.内联函数的定义须在调用之前.