Blocks、Block基础理解 \总结

一、  Blocks是C语言的 扩展功能带有自动变量(局部变量)的匿名函数。

C语言中用到的变量:自动变量(局部变量)、静态变量、静态局部变量、全局变量、函数参数

函数多次调用之间能够传递值的变量有:静态变量(静态局部变量)、静态全局变量、全局变量。因为在整个程序中,一个变量总保持在一个内存区域,虽然多次调用但是该变量值总能保持不变,在任何时候以任何状态调用,使用的都是同样的变量值。

二、Blocks模式

1、Block语法:^ 返回值类型 (参数列表) {表达式}

Block类型变量

a  通过typedef声明blk_type类型变量

typedef int (^blk_type)(int);

blk_type blk_1;

b   一般声明Block类型变量:

int (^blk_1)(int);

将Block赋值为Block类型变量:

int (^blk_1)(int) = ^(int count){return count+1;};

int (^blk_2)(int);

blk_2=blk_1;

Block类型变量与C语言变量一样,可以作为:自动变量、静态变量、静态局部变量、全局变量、函数参数

(函数返回值、指向Blcok类型的变量即Block的指针类型变量)。

2、截获自动变量值

“带有自动变量值”在Blocks中表现为“截获自动变量值”:即保存该自动变量的瞬间值,保存后就不能改写该值

3、__block说明符

若想在Blocks语法表达式中将 值 赋给在Blocks语法外声明的 自动变量,需要在该自动变量上附加__block说明符。

4、截获的自动变量(非OC对象、OC对象、数组)

a 将值赋值给Block中截获的自动变量,会产生编译错误。

b 截获OC对象,对OC对象赋值会产生编译错误( obj=obj ),但是使用OC对象就不会产生编译错误( [obj addObject:**] )

c 在Blocks中截获自动变量的方法并没有实现对C语言数组的截获,可以使用指针解决该问题。

  const char text[]="hello";

void(^blk)(void)=^{printf("%c\n",text[2]);}

以上代码报错。修改为:

const char *text="hello";

void(^blk)(void)=^{printf("%c\n",text[2]);}

三、Blocks实现

1、Block的实质:一个Block是一个结构体实例,结构体中有isa指针,指向所属类,说明:Block是OC对象。

注:所属类也是一个结构体实例,结构体中有isa指针,指向其父类-----一级一级直到超类

“OC中由类生成对象”:意味着“生成由该类生成的对象的结构体实例”,生成的各个对象,即由该类生成的对象的各个结构体实例,结构体中成员变量isa指针保持该类的结构体实例指针。

2、截获自动变量值

“截获自动变量值”:在执行Block语法时,Block语法表达式所 使用自动变量值 被保存到Block的结构体实

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值