Block

一、block 使用

声明、实现、远行(定义=声明+实现)

    // 赋值左边为 block 的声明,右边为 block 的实现,合在一起为 block 的定义
    NSInteger (^sumBlock)(NSInteger, NSInteger) = ^NSInteger(NSInteger a, NSInteger b) {
        return a + b;
    };

二、block 捕获外部变量

1、全局静态变量,局部静态变量、全局变量
运行时直接从数据区取数据
2、局部变量
实现时捕获局部变量。值类型的捕获具体值,引用类型的捕获指向对象的指针。
3、__blcok 修饰符修改局部变量
__block 作用可以看做这样:获取外部变量本身的地址。所以可以修改外部变量内存储数据。

    __block NSInteger t = 10;
    void (^testBlock)(void) = ^{
        NSLog(@"%@", @(t));
        t++;
        NSLog(@"%@", @(t));
    };
    t = 20;
    testBlock();

三、循环引用

弱应用外部变量
__weak typeof(self) weakSelf = self;

四、block 实质和分类

block 实质是一个匿名函数,可以像对象一样对它进行内存管理。
block 有三种类型:
1、不引用外部变量的block 为全局block,存放在全局数据区。
2、引用外部变量的block 如果没有被copy 引用,则属于栈block,存放在栈区。
3、引用外部变量的block 如果被copy 引用,则属于堆block,存放在堆区。

注意概念:
全局变量,局部变量
成员变量和属性
内存分区:
程序区、数据区、堆区、栈区
数据区分为:字符串常量区、全局区(和静态区一起)

posted @ 2021-01-16 12:34  ebamboo  阅读(244)  评论(0)    收藏  举报