基本用法
- 作用
block用來(lái)保存一段代碼 - block的標(biāo)志: ^
- block與函數(shù)
- block與函數(shù)很像
1.可以保存代碼
2.有返回值
3.有形參
4.調(diào)用方式一樣
- block與函數(shù)很像
- Block的使用很像函數(shù)指針,不過(guò)與函數(shù)最大的不同是:Block可以訪問(wèn)函數(shù)以外、詞法作用域以內(nèi)的外部變量的值。換句話說(shuō),Block不僅 實(shí)現(xiàn)函數(shù)的功能肠槽,還能攜帶函數(shù)的執(zhí)行環(huán)境
定義block變量
/**
如果block沒(méi)有形參,可以省略后面的()
*/
void (^myBlock)() = ^{
NSLog(@"------");
NSLog(@"--------");
};
myBlock();
定義屬性block
@property (nonatomic, copy) void (^completionClock)();
帶參數(shù)和返回值的block
int sum(int a, int b)
{
return a + b;
}
int main()
{
//指向函數(shù)的指針
int (*p)(int,int) = sum;
int d = p(10,12);
NSLog(@"%d",d);
//OC中不常用指向函數(shù)的指針,一般用block代替
int (^sumblock)(int, int) = ^(int a, int b) {
return a + b;
};
int c = sumblock(11, 11);
NSLog(@"%d",c);
//用block輸出n條直線
void (^lineblock)(int) = ^(int n)
{
for (int i = 0; i < n; i++) {
NSLog(@"------");
}
};
myblock2(5);
return 0;
}
block使用總結(jié)
1>如何定義block變量
int (^sumBlock)(int,int); void (^myBlock)();
2>如何利用block封裝代碼
^(int a, int b) {
return a - b;
};
^() {
NSLog(@"----");
};
^ {
NSLog(@"-----");
};
-
block訪問(wèn)外部變量
- block內(nèi)部可以訪問(wèn)外面的變量
- 默認(rèn)情況下吐葱,block內(nèi)部不能修改外面的局部變量
- 給局部變量加上__block關(guān)鍵字,這個(gè)局部變量可以在block內(nèi)部修改
利用typedef定義block類(lèi)型
typedef int (^MyBlock)(int, int);
以后就可以利用MyBlock這種類(lèi)型來(lái)定義block變量
MyBlock block;
MyBlock b1,b2;
b1 = ^(int a, int b) {
return a + b;
};
MyBlock b3 = ^(int a, int b){
return a + b;
};