一、block基本语法
1、定义块必须以^开头
2、定义块的返回值类型可以省略,而且经常会省略声明块的返回值类型
3、定义无须制定名字
4、如果快没有返回值,块无需带参数,通常建议使用void作为占位符
定义块格式:返回值类型(^block名称)(形参列表)=^(形参列表){};
代码块可以进行复用,可以反相传值。
例1:先声明、再实现。
NSLog(@"这是一个代码块");
return 1;
int (^sumblock)(int a,int b)=^(int a,int b){
return a+b;
};
//调用
int sum=sumblock(10,20);
NSLog(@"sum=%d",sum);
NSString *(^charblock)(NSString *s)=^(NSString *s){
NSLog(@"s=%@",s);
return s;
};
charblock(@"字符串");
__block int a=0;
void(^myblock1)()=^(){
a++;
};
static int e;
void (^myblock3)()=^(){
e++;
};
#import <Foundation/Foundation.h>
void fun(int(^myblock)(int a,int b)){
int mul=myblock(4,5);
NSLog(@"mul=%d",mul);
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
//调用方法1:
int (^myblock1)(int c,int d)=^(int a,int b){
return a*b;
};
fun(myblock1);
//调用方法2
fun(^int(int a, int b) {
return a*b;
});
}
return 0;
}
//字符串作为函数调用 方法1
void fun1(NSString *(^block)(NSString *s)){
NSString *s=@"这是一个字符串";
NSLog(@"s1=%@",block (s));
}
//字符串作为函数调用 方法2
void fun2(NSString *(^block2)(NSString *s),NSString *s2){
NSLog(@"s2=%@",block2(s2));
}
int main(int argc, const char * argv[]) {
@autoreleasepool{
//字符串作为函数调用 方法1
NSString *(^block1)(NSString *s)=^(NSString *s1){
return s1;
};
fun1(block1);
//字符串作为函数调用 方法2
fun2(^NSString *(NSString *s) {
return s;
}, @"这是一个字符串");
}
return 0;
}