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

2016-11-23  本文已影响0人  徐恩_

第二章 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 截获自动变量的方法中实现

上一篇下一篇

猜你喜欢

热点阅读