什么是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

版权声明:
作者:Amber
链接:https://late.run/archives/156
来源:LATE-努力努力再努力
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录