Block(一)基础-b
2024-08-29 17:27:32
一、概述
Block是C级别的语法和运行时特性。Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存、堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block。
二、热身
先看一个比较简单的Block例子:
1
2
3
4
|
int multiplier = 7 ; int (^myBlock)( int ) = ^( int num) { return num * multiplier; }; |
在这个例子中,myBlock是一个Block变量,它接受一个int类型的参数,返回一个int类型的值。是不是很像C函数?
来,让我们typedef一下
1
2
3
|
typedef void (^BoolBlock)( BOOL ); //一个只接受一个BOOL参数,没有返回值的block typedef int (^IntBlock)( void ); //一个没有参数,返回int的block typedef BoolBlock (^HugeBlock)(IntBlock); //看看,这个HugeBlock的参数和返回值都是block |
1
|
|
三、更详细的例子
注意,上面的typedef都还有效~
主动调用一下:
1
2
3
4
5
6
7
8
|
- ( void )someMethod { BoolBlock ablock = ^( BOOL bValue) { NSLog ( @ "Bool block!" ); }; ablock(); } |
作为参数返回:
1
2
3
4
5
6
7
8
|
typedef void (^BoolBlock)( BOOL ); - (BoolBlock)foo() { BoolBlock ablock = ^( BOOL bValue) { NSLog ( @ "Bool block!" ); }; return [ablock copy ] ; //一定要copy,将其复制到堆上,更详细的原理,将在后续章节讲解 } |
类的一个成员:
1
2
3
4
5
6
7
8
|
@interface OBJ1 : NSObject @property ( nonatomic , copy )BoolBlock block; //理由同上啊,同学们 @end OBJ1 *obj1 = ... obj1.block = ^( BOOL bValue) { NSLog ( @ "Bool block!" ); }; |
其他函数的参数:
1
2
3
4
5
6
|
- ( void )foo(BoolBlock block) { if (block) { block(); } } |
甚至其他block的参数:
1
2
3
4
|
BoolBlock bBlock = ^( BOOL bV){ if (Bv){ /*do some thing*/ }}; HugeBlock hBlock = ^(BoolBlock bB) {bB();}; hBolck(bBlock); |
啊,全局变量!:
1
2
3
4
5
6
|
static int (^maxIntBlock)( int , int ) = ^( int a, int b){ return a>b?a:b;}; int main() { printf( "%d\n" , maxIntBlock( 2 , 10 )); return 0 ; } |
好了,你知道block大概能怎么用了。
四,特殊的标记,__block
如果要在block内修改block外声明的栈变量,那么一定要对该变量加__block标记:
1
2
3
4
5
6
7
8
9
|
int main() { __block int i = 1024 ; BoolBlock bBlock = ^( BOOL bV) { if (bV) { i++; //如果没有__block标记,是无法通过编译的。 } }; } |
最新文章
- Spring+SpringMvc+Mybatis框架集成搭建教程四(项目部署及测试)
- dhtmlx相关
- 报错 - Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lex failed with exit code 1
- Spring常用工具类
- 图层的transform属性
- Add, remove, shuffle and sort
- Oracle Standby Database 实现方案
- MyEclipse新建Maven工程
- 图片自动转换效果 jquery
- PHP结合Linux的cron命令实现定时任务
- Drainage Ditches(最大流)
- hdu_1029_hash/map
- 网页换肤:原生js与jq
- java_自定义标签运行原理
- 19/03/30Python笔记
- pyhon_day1 格式化输出
- def 函数的不定长函数
- ATL、MFC、WTL CString 的今生前世(转载)
- python之路----面向对象的多态特性
- Django入门与实践-第22章:基于类的视图