Blocks —— 《Objective-C高级编程 iOS与OS X多线程和内存管理》


Blocks概要

什么是Blocks

Blocks是C语言的扩充功能,即带有局部变量的匿名函数。

顾名思义,不带有名称的函数,C语言的标准可不允许存在这样的函数。就算是使用函数指针调用函数也需要知道函数名称。

OC转C++方法

因为需要看Block操作的C++源码,所以要知道转换的方法:

打开终端,cd到OC源文件.m所在的文件夹,输入clang -rewrite-objc 文件名称.m,就会在当前文件夹内自动生成对应的.cpp文件.

关于几种变量的特点

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

  • 函数参数
  • 自动变量(局部变量)
  • 静态变量(静态局部变量)
  • 静态全局变量
  • 全局变量

而且,由于存储区域特殊,这其中有三种变量是可以在任何时候以任何状态调用的(在函数的多次调用之间能够传递值的变量):

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

虽然这些变量的作用域不同,但在整个程序中,一个变量总保持在一个内存区域。而其他两种虽然有各自相应的作用域,超过作用域后,会被销毁。

Blocks模式

Block语法

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

  1. 没有函数名,即匿名函数;
  2. 带有^,因为iOS、Mac OS应用程序的源代码中将大量使用Block,所以插入该记号便于查找。

Block语法的BN范式:^ 返回值类型 参数列表 表达式。例如:

^int (int value, int count) {
   return count * value;}

可省略返回值类型

^(int value, int count) {
   return count * value;}

省略返回值类型的情况下:

  • 表达式中return的类型就是返回类型;
  • 表达式中无return语句说明是void类型;
  • 表达式中含有多个return语句时,所有return的返回值类型必须相同。

可省略参数列表,如果不使用参数:

^void (void) {
   printf("Blocks\n");}
//省略形式
^{
   printf("Blocks\n");}

Block类型 变量

定义C语言函数时,可以将所定义的函数的地址赋值给函数指针类型的变量:

int func(int count) {
   
    return count + 1;
}
int (*funcptr) (int) = &func;

同样的,Block是一种数据类型,可将Block语法赋值给声明为Block类型的变量:

//声明Block类型变量仅仅是将声明函数指针类型变量的*变为^
int (^blockName) (int);

//赋值(Block内容的实现)
int (^blockName) (int) = ^(int count) {
   
    return count + 1;
};

如果我们在项目中经常使用某种相同类型的block,可以用typedef抽象出这种类型的Block:

typedef int (^AddOneBlock) (int count);
AddOneBlock blockName = ^(int count) {
   return count + 1;};

typedef给Block起别名,使得block的赋值和传递变得相对方便,因为block一经抽象出来了:

typedef int (^block_t) (int);

//block作为参数
void func(int (^blockName) (int));
//简化后
voi
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值