1.Block入门
Block是C语言的扩充功能。简单的来说:Block就是带有自动变量(局部变量)的匿名函数。这个可以类比C语言的函数指针。Block有着灵活和强大的功能,而且不需要命名。Block其实就是一个代码块,把你想要执行的代码封装在这个代码块里,等到需要的时候再去调用。那block是OC对象吗?答案是肯定的。这里把学习Block的过程记录下来。
1.1 Block的语法:
^ + 返回值类型 + 参数列表 + 表达式
上面就是典型的block语法规范,举个简单例子:
^ NSInteger (NSInteger num1, NSInteger num2) {
return num1 + num2;
};// 一个返回num1 + num2 的简单block
当然block语法可以省略,当返回值或参数列表为void时就可以省略,例子如下:
^(int count){count++; };// 等价于 ^void (int count){ count++; };
^{printf("hello block");}; //等价于 ^void (void){ printf("hello block"); };
block语法还可以省略返回值类型,这是因为表达式中含有return语句时,其返回值类型必须与其一致,基于这种特性,我们可以省略返回值类型,简单样例如下:
^(int count){ return count++; };// 等价于^int (int count){ return count++; };
1.2 Block作为类型变量:
在C语言中,我们知道声明一个函数指针的语法模式如下:
int func(int count) {
return count++;
}
int (*funcPtr)(int) = &func;
同样的,block的语法类似:
int (^func)(int) = ^ (int count) {
return count++;
};
既然可以作为变量,那么用法就会非常灵活,我们可以在函数返回和使用block变量,可以将block作为函数参数,实例如下:
// 定义几种类型的block
typedef void (^blk_1) (void);
typedef int (^blk_2) (void);
typedef int (^blk_3) (int);
// 1.作为函数返回;
- (blk_1)func1 {
return ^ {
NSLog(@"block作为返回类型");
};
}
// 2.作为参数
- (void)func2:(blk_3)blk {
blk = ^ (int count){
return count ++;
};
}
1.3 blcok赋值
block的赋值
格式:block = ^返回值类型(参数列表){}
没有参数没有返回值
myBlock testBlock = ^void(){
NSLog(@"test");
};
// 没有返回值,void可以省略
myBlock testBlock1 = ^(){
NSLog(@"test1");
};
// 没有参数,小括号也可以省略
myBlock testBlock2 = ^{
NSLog(@"test2");
};
有参数没有返回值
myBlock1 testBlock = ^void(NSString *str) {
NSLog(str);
}
//省略void
myBlock1 testBlock = ^(NSString *str) {
NSLog(str);
}
有参数有返回值
myBlock2 testBlock = ^NSString *(NSString *str) {
NSLog(str)
return @"hi";
}
//有返回值时也可以省略返回值类型
myBlock2 testBlock2 = ^(NSString *str) {
NSLog(str)
return @"hi";
}
1.4 block作用
block是用来封装一段代码,这段代码可以在任何时候调用
与C中指向函数的指针 类似处
block可以做为方法/函数的参数与返回值
block可以接收参数与返回值
与C中指向函数的指针 不同处
block是inline的,并且对局部变量是只读的;