iOS Block用法和实现原理

2019-05-05  本文已影响0人  00after

原文
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 ++;
    };
}
上一篇下一篇

猜你喜欢

热点阅读