黑馬程序員——IOS基礎——Block

------- 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;
}


------- android培訓java培訓、期待與您交流!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章