内存管理与自动引用计数学习 — 第六日

第二章 Blocks

2.1 Blcock概要

带有自动变量的匿名函数

2.2 Blocks模式

2.2.1 BLock语法

“^” “返回值” “参数列表” “表达式”

返回值和参数列表可省略

与C语言函数名对比

a. 没有函数名

b. 带有 “^”

2.2.2 Blocks类型变量

C语言函数指针

int func(int count) {

return count + 1;

}

int (*funcptr)(int) = &func;

Blocks的声明

int (^blk)(int);

Block可以作为任何参数使用。

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

Block类型变量的简单记述

typedef int (^blk_t)(int);

/*

* 原来的记述方式

* void func (int (^blk)(int))

*/

void func (blk_t blk)

/*

* int (^func()(int))

*/

void func(func()(int))

Block的使用

int resulet = blc(10)

2.2.3 自动变量值捕获

int main() {

int dmy = 256;

int val = 10;

const char *fmt = “val = %d\n”;

void (^blk)(void) = ^{printf(fmt, val);};

val = 2;

fmt = “New formmat val = %d\n”;

return 0;

}

该 block 在执行时,字符串指针“val = %d\n”被赋值给自动变量 fmt,int值被复制到自动变量 val 中,因此这些值被保存(即被截获),从而在执行块时使用。

2.2.4 __block 说明符

只能保存执行 block 语法孕检的值,保存后就不能改写该值。给该自动变量附加 __block 说明符,就能实现在 block 内赋值

2.2.5 截获的自动变量

NSMutableArray 可添加修改删除元素,不可重新赋值

C语言数组的截获没有在 block 截获自动变量的方法中实现

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容