什么是Block?iOS中Block实现原理
Block是一种可以捕获自动变量值的匿名函数,它可以作为参数传递给其他函数,也可以作为普通变量赋值或返回
Block和函数的区别有以下几点:
- 声明方式不同,Block使用^符号,函数使用()符号。
- Block可以访问和修改外部变量的值,函数只能访问外部变量的值。
- Block可以在任何地方定义和使用,函数只能在全局或局部作用域定义和使用。
Block的底层实现原理是这样的:
Block本质上是一个结构体,其中包含了一个函数指针,一个描述信息,以及一些捕获的变量。
举个例子:
returnType (^blockName) (parameterTypes) = ^returnType (parameters) {
// block body
};
其中,returnType是Block返回的类型,blockName是Block的名称,parameterTypes是Block接受的参数类型列表,parameters是Block接受的参数列表,block body是Block执行的代码块。
例如,定义一个Block来计算两个整数的和:
int (^sumBlock) (int, int) = ^int (int a, int b) {
return a + b;
};
// 使用
int result = sumBlock (3, 4); // result is 7
Block有三种类型:_NSConcreteGlobalBlock(全局Block),_NSConcreteStackBlock(栈Block),_NSConcreteMallocBlock(堆Block)。
- 全局Block是存储在全局数据区的静态常量,它不会捕获任何变量,也不会被复制或释放。
- 栈Block是存储在栈上的临时变量,它会捕获外部变量的值或引用,但是当超出作用域时就会被销毁。如果对栈Block进行复制操作,就会把它转换为堆Block。
- 堆Block是存储在堆上的动态变量,它会捕获外部变量的值或引用,并且有引用计数管理。当引用计数为0时就会被释放。
也可以使用clang命令来查看Block的底层实现代码
例如,在终端中输入以下命令:
clang -rewrite-objc main.m
就可以把main.m文件中的Objective-C代码转换为C++代码,其中包含了Block的结构体定义和函数实现。
参考:
https://stackoverflow.com/questions/20562769/ios-blocks-how-to-use-in-different-implementation-files
https://topic.alibabacloud.com/a/a-brief-analysis-of-the-principle-of-ios-block_1_12_30754785.html
文章目录
关闭
共有 0 条评论