认识块
Block(块)是oc对ANSI C所做的扩展,使用块可以更好的简化oc的编程,且oc许多API都依赖于块。
- 定义块必须以^开头。
- 定义块的返回值类型可以省略,且通常省略声明块的返回值类型。
- 定义块无需指定名字
- 如果块无返回值,块无须带参数,通常建议使用void作为占位符。
块很像函数
定义块的语法格式如下
^ [块返回值类型] (形参类型1 形参1, 形参类型2 形参2, ...)
{
//块执行体
}110
块变量与函数指针非常相似
块更像是一个匿名函数。当程序调用块时,调用块的语法与调用函数完全相同。我的理解是,完全可以把块当成一种简化的函数。
例如:
#import <Foundation/Foundation.h>
int main(int argc, char * argv[]) {
@autoreleasepool{
//定义不带参数,无返回值的块
void (^printStr) (void) = ^(void) {
NSLog(@"我正在学习O-C的块");
};
//
double (^hypot)(double, double)= ^ (double num1, double num2){
return sqrt(num1 * num1 + num2 * num2);
};
printStr();
//调用块,并输出返回值
NSLog(@"%g",hypot(3, 4));
//也可以先只定义块变量:定义带参数、无返回值的块
void (^print)(NSString*);
//再将块赋给指定的块变量
print = ^(NSString* info) {
NSLog(@"info参数为:%@", info);
};
//调用块
print(@"学习块的知识");
}
}
从例子里可以看到输出
我正在学习O-C的块
5
info参数为:学习块的知识
认识认识块中的局部变量
块可以访问程序中局部变量的值,当访问局部变量的值时,不允许修改局部变量的值
直接使用块作为参数
把块作为方法参数时,无需定义块变量,直接把块作为参数传给指定的方法即可。需要特别提到的是,块只能作为方法的最后一个参数。
使用typedef定义块变量类型
使用typedef可以定义块变量类型,一但定义了块变量类型,该块主要有两个用途:
- 复用块变量类型,使用块变量类型可以重复定义多个块变量。
- 使用块变量类型定义函数参数,这样即可以定义带块参数的函数。
使用typedef定义块变量类型的语法格式如下:
typedef 块返回值类型 (^块变量类型)(形参类型1, 形参类型2, ···);
这次主要任务就是认识块,并学习如何定义一个块,重点掌握定义块的语法即可,其他的主要就是简单认识一下,留到之后继续讨论。