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,存放在堆区。
注意概念:
全局变量,局部变量
成员变量和属性
内存分区:
程序区、数据区、堆区、栈区
数据区分为:字符串常量区、全局区(和静态区一起)

浙公网安备 33010602011771号