美文网首页『ios』进阶
『ios』篇简介NS_INLINE内联函数

『ios』篇简介NS_INLINE内联函数

作者: butterflyer | 来源:发表于2018-08-28 15:22 被阅读5次

    在.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

    相关文章

      网友评论

        本文标题:『ios』篇简介NS_INLINE内联函数

        本文链接:https://www.haomeiwen.com/subject/nntqwftx.html