------- android培訓、java培訓、期待與您交流!
Block 封裝了一段代碼,可以在任何時候執行
Block可以作爲函數參數或者函數的返回值,而起本身又可以帶輸入參數或返回值
多用於 多線程、異步任務、集合遍歷、集合排序、動畫轉場等
block總結:
1.>定義block變量:
int (^sumBlock)(int ,int);
void (^myBlock)();
2.>利用block封裝代碼
^(int a,int b){
return a - b;
}
^{
NSLog(@"");
}
3.>block訪問外部變量
block 內部可以訪問外面的變量
默認情況下,block內部變量不能修改外面的局部
給局部變量加上__block關鍵字,這個局部變量就可以在block內部修改
4.>利用typedef定義block類型
typedef int (^MyBlock)(int,int);
//test3:利用typedef 簡化聲明定義block
typedef int (*SumP)(int,int);
typedef int (^MyBlock)(int,int);
int sum(int a,int b){
return a+b;
}
void test4(){
SumP p = sum;
SumP p2 = sum;
MyBLock = sumBlock;
sumBlock = ^(int a,int b){
return a+b;
};
MyBlock = minusBlock(^int a,int b){
return a-b;
};
NSLog(@"%d - %d",sumBlock(10,9),minusBlock(10,5));
}
//test3:block修改外部的變量
void test3(){
int a = 10;
__block int b = 20;
void (^block)();
block=^{
//block 內部可以訪問外面的變量
NSLog(@"a = %d",a);
//默認情況下,block內部變量不能修改外面的局部
a = 20;//這是不可以的
//給局部變量加上__block關鍵字,這個局部變量就可以在block內部修改
b = 25;
};
block();
}
//test2:有返回值,有形參的block
void test(){
int (*sumpoint)(int,int) = sum; //可以對比一下
int d = p(10,13);
int (^sumblock)(int,int)=^(int a,int b){
return a+b;
}
int c = sumblock(10,11);
NSLog(@"%d",c);
void (^lineBlock)(int) = ^(int n){
for(int i=0;i<n;i++){
NSLog(@"----------------");
}
};
lineBlock(5);//輸出五條線
return 0;
}
//test1:沒有返回值,沒有形參的block
void test1(){
//block 用來保存一段代碼
//block的標誌: ^
/*
block跟函數很像:
1.可以保存代碼
2.有返回值
3.有形參
4.調用方式一樣
*/
//定義block變量
void (^myblock)() = ^{ /^() 可以省略括號
NSLog(@"----------");
NSLog(@"----------");
};
//利用block變量調用block內部的代碼
myblock();
//int a = 10;相似
return 0;
}