『ios』进阶

『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.内联函数的定义须在调用之前. 

ios自习室欢迎进入,一起学习一起进步。

IMG_7291.JPG
上一篇下一篇

猜你喜欢

热点阅读