《Objective-C高级编程》---笔记---Block

什么是Block?

带有自动变量(局部变量)的匿名函数。

在C语言的函数中可能使用的变量:

  • 自动变量(局部变量) int a = 10;
  • 函数的参数
  • 静态变量(静态局部变量) static int a = 10;//局部变量的生命周期延长
  • 静态全局变量 static int a = 10;//作用域修改,只在该文件中可以使用,其他文件不能使用
  • 全局变量int a = 10;

其中,在函数的多次调用之间能够传递值的变量有:

  • 静态变量(静态局部变量)
  • 静态全局变量
  • 全局变量

注意区分:作用域、生命周期

虽然上述三个变量的作用域各不相同,但在整个程序当中,一个变量总保持在一个内存区域。因此,虽然多次调用函数,但该变量值总能保持不变,在任何时候以任何状态调用,使用的都是同样的变量值。

^void (int event) {
	print("");
}

该完整形式的Block语法,与一般C语言函数定义相比,仅有两点不同。

  • 没有函数名(因为Block就是匿名函数)
  • 带有^

在这里插入图片描述

问:怎么理解,block是一个匿名函数,Block又是一个对象?
int age = 20;
void (^block)(void) = ^{
	NSLog(@"age is %d", age);
}

首先,等号左边是一个变量,且是一个指针变量,也就是一个存放指针的变量。

那么,存放的变量是什么类型呢?

void(*block)(int, int) = &__main_block_impl_0(__main_block_func_0, &__main_block_desc_0_DATA, age));
等号右边,首先有一个__main_block_impl_0函数调用,并将函数返回值赋值的地址给等号左边

__main_block_impl_0函数有返回值,返回的是一个结构体

__main_block_impl_0结构体里面里面是有isa指针的

也就是,函数返回的不仅仅是结构体,也可以称为是一个对象。

也就是,
等号左边,是一个存放对象的指针变量
等号右边,是一个匿名函数的构造函数,该函数有返回值,返回值是一个结构体对象,然后是&取地址操作。

那么,block就是一个对象
至于匿名函数,说的是右边的函数调用。

main_block_impl_0的命名,main指的是当前block所在的函数名,block在该函数出现的顺序值(0),来给clang变换的函数命名

所谓Block就是OC对象

id这一变量类型用于存储OC对象

typedef struct objc_object {
	Class isa;
} *id

id为objc_object结构体的指针类型。

也就是,id是一个结构体指针

auto表示作为自动变量存储在栈中
static表示作为静态变量存储在数据区

在这里插入图片描述

配置在全局变量上的Block,从变量作用域外也可以通过指针安全地使用。但是设置在栈上的Block,如果其所属的变量作用域结束,该Block就被废弃。

在这里插入图片描述

因此,Blocks提供了将Block和_block变量从栈上复制到堆上的方法来解决这个问题。将配置在栈上的Block复制到堆上,这样即使Block语法记述的变量作用域结束,堆上的Block还可以继续存在。

在这里插入图片描述
复制到堆上的Block,将_NSConcreteMallocBlock类对象写入Block用结构体实例的成员变量isa。
imp.isa = &_NSConcreteMallocBlock;

__block变量用结构体成员变量__forwarding可以实现无论__block变量配置在栈上还是堆上时,都能够正确地访问__block变量。

在这里插入图片描述
Block是存储在堆上的,因此,需要程序自己手动管理其生成与释放。
又由于Block是对象,那么是通过autoreleasepool管理的。
也就是,Block也是通过自动释放池进行内存管理的。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过该功能,无论是在Block语法中、Block语法外使用 __block变量,还是 __block变量配置在栈上或堆上,都可以顺利地访问同一个 __block变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值