美文网首页
iOS Block用法和实现原理

iOS Block用法和实现原理

作者: 00after | 来源:发表于2019-05-05 11:35 被阅读0次

    原文
    iOS Block用法和实现原理

    《Objective-C高级编程》是一本有趣又难懂的书,全书就讲了引用计数、Block、GCD三个概念,有趣是因为讲原理、实现的部分是其它iOS专业书籍里少有的。然而每个章节不读个三五遍还是比较难理解贯通的。本文针对其中的Block部分做些简单的笔记记录,讲述Block的用法和部分实现原理,详细解说从原书中寻。

    Block概要

    Block:带有自动变量的匿名函数。
    匿名函数:没有函数名的函数,一对{}包裹的内容是匿名函数的作用域。
    自动变量:栈上声明的一个变量不是静态变量和全局变量,是不可以在这个栈内声明的匿名函数中使用的,但在Block中却可以。
    虽然使用Block不用声明类,但是Block提供了类似Objective-C的类一样可以通过成员变量来保存作用域外变量值的方法,那些在Block的一对{}里使用到但却是在{}作用域以外声明的变量,就是Block截获的自动变量。

    Block常规概念

    Block语法
    Block表达式语法:

    ^ 返回值类型 (参数列表) {表达式}
    

    例如:

        ^ int (int count) {
            return count + 1;
        };
    

    其中,可省略部分有:
    返回类型,例:

        ^ (int count) {
            return count + 1;
        };
    

    参数列表为空,则可省略,例:

        ^ {
            NSLog(@"No Parameter");
        };
    

    即最简模式语法为:

    ^ {表达式}
    

    Block类型变量

    声明Block类型变量语法:

    返回值类型 (^变量名)(参数列表) = Block表达式
    

    例如,如下声明了一个变量名为blk的Block:

        int (^blk)(int) = ^(int count) {
            return count + 1;
        };
    

    当Block类型变量作为函数的参数时,写作:

    - (void)func:(int (^)(int))blk {
        NSLog(@"Param:%@", blk);
    }
    

    借助typedef可简写:

    typedef int (^blk_k)(int);
    
    - (void)func:(blk_k)blk {
        NSLog(@"Param:%@", blk);
    }
    

    Block类型变量作返回值时,写作:

    - (int (^)(int))funcR {
        return ^(int count) {
            return count ++;
        };
    }
    

    借助typedef简写:

    typedef int (^blk_k)(int);
    
    - (blk_k)funcR {
        return ^(int count) {
            return count ++;
        };
    }
    

    相关文章

      网友评论

          本文标题:iOS Block用法和实现原理

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