block

来源:互联网 发布:七音符网络机顶盒升级 编辑:程序博客网 时间:2024/06/06 00:07

1) block最简单形式

定义格式:
void(^block名)() = ^{代码块;}

使用格式:
block();

void(^myBlock)() = ^ {NSLog(@"hello");

};

//执行时,把block当成函数myBlock();


2) block带有参数的block的定义和使用

格式:

void (^block名称)(参数列表)= ^ (参数列表) { //代码实现; }

//定义有参数的block
void(^sumBlock)(int,int) = ^ (intx,inty) {

NSLog(@"%d", x + y);};

//调用blocksumBlock(10,20);


3) 带有参数和返回值的block

格式:
返回类型
(^block名称)(参数列表)

= ^返回类型(参数列表) { // 代码实现; }

//定义有返回值和参数的block
int(^sumBlock2)(int,int) = ^int(inta,intb) {

returna + b;};

//调用有返回值的blockNSLog(@"%d", sumBlock2(4,8));



blocktypedef

格式:
typedef返回值类型(^新别名)(参数类型列表);

Typedef int(^MyBlock)(int ,int);

//给无参无返回值block变量起别名;//格式:void (^新类型名)();typedef void (^newType)();

//用新的类型定义block变量newTypet1;

t1 = ^{NSLog(@"我是使用newType定义出来的变量t1的值");

};

//使用blockt1();



block访问外部变量

1)在block内部可以访问block外部的变量

block内部可以使用外部变量,但是注意,这是一个新的内存空间变量

block内部也可以定义和block外部的同名的变量(局部变量),此时局部变量会暂时屏蔽外部变量的作用域

2)在block内部不可以修改block "外部的变量"

非局部变量会以const变量被拷贝并存储到block中,也就是说block对其是只读的。如果尝试在block内部给make变量赋值,会抛出编译器错误。

给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。

注意:

一、静态变量 和 全局变量 在加和不加 __block 都会直接引用变量地址。也就意味着 可以修改变量的值。在没有加__block 参数的情况下。

二, 常量变量(NSString *a = @"hello";a 为变量,@“hello”为常量。)-----不加__block类型block 会引用常量的地址(浅拷贝)。加__block类型 block会去引用常量变量(如:a变量,a =@"abc".可以任意修改a 指向的内容。)的地址。

如果不加__block直接在block内部修改变量 ,会编译报错。block内部改变量是 只读的。






0 0