一、概述

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标记,是无法通过编译的。
        }
    };
}
 
 
 

最新文章

  1. Spring+SpringMvc+Mybatis框架集成搭建教程四(项目部署及测试)
  2. dhtmlx相关
  3. 报错 - Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lex failed with exit code 1
  4. Spring常用工具类
  5. 图层的transform属性
  6. Add, remove, shuffle and sort
  7. Oracle Standby Database 实现方案
  8. MyEclipse新建Maven工程
  9. 图片自动转换效果 jquery
  10. PHP结合Linux的cron命令实现定时任务
  11. Drainage Ditches(最大流)
  12. hdu_1029_hash/map
  13. 网页换肤:原生js与jq
  14. java_自定义标签运行原理
  15. 19/03/30Python笔记
  16. pyhon_day1 格式化输出
  17. def 函数的不定长函数
  18. ATL、MFC、WTL CString 的今生前世(转载)
  19. python之路----面向对象的多态特性
  20. Django入门与实践-第22章:基于类的视图

热门文章

  1. Pandas DataFrame学习笔记
  2. Javascript 的模块化编程及加载模块【转载+整理】
  3. jdbc:initialize-database标签的研究
  4. SuperMap入门3——Hello World
  5. Spring-boot JMS 发送消息慢的问题解决
  6. String的一些方法试探
  7. EL表达式学习笔记
  8. cocos2d-js 免安装在线版 粒子编辑器 particle editor particle builder 兼容pex和plist
  9. V-rep学习笔记:机器人模型创建2—添加关节
  10. python之模块poplib之常见用法