c语言局部变量的性质,C语言特性(块)

本文详细介绍了Objective-C中块(block)的概念,包括块的定义语法、与函数的区别、块变量的使用、访问局部变量以及typedef定义块类型的应用实例。通过实例演示如何利用块简化编程并展示其在API中的重要作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

块(Block)是Objective-C对ANSI C所做的扩展,使用块可以更好地简化Objective-C编程,而且Objective-C的很多API都依赖于块

块的基本语法

定义块的语法格式如下:

^[块返回值类型] (形参类型1 形参1,形参类型2 形参2, ...){

//块执行体

}

从上面的语法格式可以看出,定义块的语法非常像定义一个函数,但只是定义一个匿名函数。定义块与定义函数的语法格式存在如下差异。

1.定义块必须以^开头。

2.定义块的返回值类型可以省略,而且经常都会省略声明块的返回值类型。

3.定义块无须指定名字。

4.如果块没有参数,此时参数部分括号不能省略,但内部可以留空,通常建议使用void作为占位符。

如果程序需要以后多次调用已经定义的块,那么应该将该块赋给一个块变量。定义块变量的语法格式如下:

块返回值类型 (^块变量名) (形参类型1 , 形参类型2 , ... );

例:

//定义不带参数、无返回值的块

void (^printStr) (void) = ^(void){

NSLog(@"这是块");

};

//使用printStr调用块

printStr();

//定义带参数、有返回值的块

double (^hypot) (double ,double) = ^(double num1 ,double num2){

return sqrt(num1 * num1 + num2 * num2);

};

//调用块,并输出块的返回值

NSLog(@"%g" , hypot(3,4));

//也可以先只定义块变量:定义带参数、无返回值的快

void (^print) (NSString *);

//再将块赋值给指定的块变量

print = ^(NSString * info){

NSLog(@"info参数为:%@" , info);

}

//调用块

print(@"测试块调用");

块与局部变量

块可以访问程序中局部变量的值,当块访问局部变量的值时,不允许修改局部变量的值

如果不希望在定义块时就把局部变量的值复制到块中,而是等到执行时才去访问、获取局部变量的值,甚至希望块也可以改变局部变量的值,此时可以考虑使用_block修饰局部变量。

例:

//定义_block修饰的全局变量

_block int my = 20;

void (^printMy)(void) = ^(void){

//运行时访问、获取局部变量的值,此处输出45

NSLog(@"%d" , my);

//尝试对_block局部变量赋值是允许的

my = 30;

//此处输出30

NSLog(@"%d" , my);

};

my = 45;

printMy();//调用块

//由于块修改了_block局部变量的值,因此下面的代码输出30

NSLog(@"块执行完后,my的值为:" , my);

使用typedef定义块类型

使用typedef可以定义块类型,定义了块类型后,该块类型主要有如下两个用途。

1.复用块类型,使用块类型可以重复定义多个块变量。

2.使用块类型定义函数参数,这样即可定义带块参数的函数。

使用typedef定义块类型的语法格式如下:

typedef 块返回值类型 (^块类型) (形参类型1 [形参名] ,形参类型2 [形参名] , ... );

例:

//使用typedef定义块类型

typedef void (^FKPrintBlock) (NSString*);

//使用FKPrintBlock定义块变量,并将指定块赋给该变量

FKPrintBlock print = ^(NSString * info){

NSLog(@"%@" , info);

};

//使用FKPrintBlock定义块变量,并将指定块赋值给该变量

FKPrintBlock loopPrint = ^(NSString * info){

for (int i = 0 ; i < 3 ; i++){

NSLog(@"%@" , info);

}

};

//一次调用两个块

print(@"Objective-C");

loopPrint(@"iOS");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值