一甜橱、block的基本
用^操作符來聲明一個(gè)Block變量,并指明Block述句的開始。Block的主體部分包含在 {}內(nèi),像下面的例子中一樣(與C語法一樣,“;”指明語句的結(jié)束):
- block最簡單形式
定義格式
:void (^block名)() = ^{代碼塊;}
使用格式
:block名();
/*定義時(shí),把block當(dāng)成數(shù)據(jù)類型
特點(diǎn):1. 類型比函數(shù)定義多了一個(gè) ^2. 設(shè)置數(shù)值,有一個(gè) ^,內(nèi)容是 {} 括起的一段代碼
最簡單的定義方式
void (^myBlock)() = ^ { // 代碼實(shí)現(xiàn); }/
void (^myBlock)() = ^ {
NSLog(@"hello");};
// 執(zhí)行時(shí),把block當(dāng)成函數(shù)
myBlock();
//1) 無參無返回值的block
//格式:
// -定義block變量
// 返回值類型 (^block變量名)(形參類型列表);
// -定義block變量并且賦值
// 返回值類型 (^block變量名)(形參列表)=^(形參列表){ //代碼塊 };
// 形式1: void (^block變量名)() = ^(){};
// 形式2: void (^block變量名)() = ^{}; //省略了小括號(hào)
- 例1
1)無參無返回值的block
void (^sbblock)(); //定義變量
void (^sb1)()=^(){
NSLog(@"哈哈,我來了!");
};
void (^sb2)()=^{
NSLog(@"哈哈,我又又有來了來了");
};
// 執(zhí)行block
//格式: block變量名(實(shí)參);
// sbblock(); //如果只定義栈戳,就使用岂傲,會(huì)報(bào)錯(cuò),因?yàn)閟bblock沒有初始化
sb1();
sb2();
2)有參數(shù)無返回值的block
形參列表的格式: 數(shù)據(jù)類型 變量名
void (^myblock1)(int a); // 定義一個(gè)無返回值有一個(gè)參數(shù)的block變量,變量名為myblock1
myblock1 = ^(int a){
NSLog(@"a = %d",a);
}; //分號(hào)結(jié)束
myblock1(438);
//3)有參數(shù)\有返回值的block的使用
// int sum(int a,int b){ return a+b; }
int (^myblock2)(int a,int b)=^(int a,int b){
return a+b;
};
//執(zhí)行block并且接收block執(zhí)行的結(jié)果
int sum = myblock2(20,34); //返回值
NSLog(@"sum = %d",sum);
2.block的typedef
typedef int INT; int 起個(gè)別名 INT
typedef int ARR[4]; ARR a1; //定義了一個(gè)長度為4的整形數(shù)組
格式:typedef 返回值類型 (^新別名)(參數(shù)類型列表);
Typedef int(^MyBlock)(int ,int);
例1)
//給無參無返回值block變量起別名;
//格式: void (^新類型名)();
typedef void (^newType)();
//用新的類型定義block變量
newType t1;
t1 = ^{
NSLog(@"我是使用newType定義出來的變量t1的值");
};
//使用block
t1();
3.block訪問外部變量
在block內(nèi)部可以使用外部變量,但是注意,這是一個(gè)新的內(nèi)存空間變量,以const
拷貝的方式
這樣子檀,block可以訪問外部變量镊掖,但是不可以修改
- 給局部變量加上__block關(guān)鍵字,則這個(gè)局部變量可以在block內(nèi)部進(jìn)行修改。這樣是直接給變量做了一個(gè)從
棧區(qū)拷貝到堆區(qū)的變量
,使用的是堆區(qū)的變量
//使用__weak兩種
__weak typeof(TWPhotoCollectionViewCell *) weakCell = cell;
__weak HEIMController *selfWeak = self;