Block使用
#import <Foundation/Foundation.h>
/*
block要掌握的东西
1> 如何定义block变量
1)无参数,无返回值
void (^myBlock)();
2)有参数,有返回值
int (^sumBlock)(int,int);
2> 如何利用block封装代码
1)有参数,有返回值
^(int a,int b){
return a + b;
};
2)没有参数可以省略()
^(){
NSLog(@"-------");
};
^{
NSLog(@"-------");
};
3> block访问外面的变量
1)block内部可以访问外面的变量
2)默认情况下,block内部不能修改外面的局部变量
3)给局部变量加上__block关键字,这个局部变量就可以在block内部修改
4> 利用typedef定义block类型
typedef int (^MyBlock)(int ,int);
MyBlock block;
MyBlock b1,b2;
b1 = ^(int a,int b){
return a - b;
};
MyBlock b3 = ^(int a,int b){
return a + b;
};
*/
typedef int (*SumP)(int,int);
typedef int (^MyBlock)(int,int);
int sum(int a,int b){
return a + b;
}
int main(int argc, const char * argv[])
{
return 0;
}
#pragma mark - 没有返回值、没有形参的block
void test() {
//定义block变量
void (^myBlock)() = ^{ //没有形参,^后面的(可以省略)
NSLog(@"-----");
};
//使用block变量
myBlock();
}
#pragma mark - 有返回值、有形参的block
void test2(){
int (^sumblock)(int,int) = ^(int a,int b){
return a + b;
};
int c = sumblock(10,11);
NSLog(@"%d",c);
}
#pragma mark - 数据N条横线
void test3(){
void (^lineBlock)(int n) = ^(int n){
for (int i=0; i< n; i++) {
NSLog(@"----------");
}
};
lineBlock(5);
}
#pragma mark - 定义和复制分开
/*
1.定义和复制分开
2.默认情况下,block内部不能修改外面的局部变量
3.给局部变量加上__block关键字,这个局部变量就可以在blo
*/
void test4(){
int a = 30;
__block int b = 50;
void (^block)();
block = ^{
//block内部可以访问外面的变量
NSLog(@" a = %d ",a);
//默认情况下,block内部不能修改外面的局部变量
//a = 20; //编译器报错
//给局部变量加上__block关键字,这个局部变量就可以在block内部修改
b = 55;
};
block();
}
#pragma mark - 使用typedef定义block类型
void test5(){
//int (*p)(int,int) = sum;
//int (*p2)(int,int) = sum;
SumP p = sum;
SumP p2 = sum;
NSLog(@"%d - %d",p(1,2),p2(4,5));
MyBlock sumBlock = ^(int a,int b){
return a + b ;
};
NSLog(@"%d",sumBlock(10,20));
}
浙公网安备 33010602011771号