一、block的應(yīng)用場(chǎng)景
1锡移、對(duì)象與對(duì)象之間的通信方式
1)代理-協(xié)議和媳,1對(duì)1
2)通知涵紊,1對(duì)多
3)block,1對(duì)1蛉签,但不需要協(xié)議
2胡陪、block介紹
block是iOS4.0之后新增的一種語法結(jié)構(gòu),也稱為閉包碍舍,block是一個(gè)匿名的函數(shù)代碼塊督弓,此代碼塊可以作為參數(shù)傳遞給其他對(duì)象
PS:每一個(gè)block都是一個(gè)可以有參數(shù)和返回值的方法
二、block的使用
1乒验、簡(jiǎn)單使用
1)block變量的聲明,類似聲明一個(gè)普通對(duì)象
返回值? block變量? ? 參數(shù)
int? (^ myBlocks)(int a);
2)block的創(chuàng)建蒂阱,類似將一個(gè)對(duì)象給實(shí)例化
myBlocks= ^(int a){
int result = a * a;
return result;
};
3)block的調(diào)用锻全,類似使用對(duì)象
int ret = myBlocks(10);
2、上一種方式每次我要使用一個(gè)block變量都需要聲明否則會(huì)直接將之前的覆蓋掉,為了方法我們可以定義一種blcok類型录煤,用這種block類型來聲明多個(gè)類似的block變量
1) 定義block類型
typedef int (^MyBlock)(int a);
2) 創(chuàng)建block對(duì)象
MyBlock myBlock = ^(int a){
int result = a * a;
return result;
};
3)? block的調(diào)用
int ret = myBlocks(10);
三鳄厌、block作為參數(shù)
之前我們都是將字符串、字典妈踊、數(shù)組等作為參數(shù)傳遞了嚎,沒有過將某一個(gè)方法做為參數(shù)傳遞,今天就通過block將參數(shù)傳進(jìn)來
1) 定義block類型
typedef int (^MyBlock)(int a);
2) 在延展中聲明一個(gè)方法,該方法有一個(gè)block參數(shù)
- (void)objectMethod:(MyBlock)myblock
3) 在類中實(shí)現(xiàn)這個(gè)方法
- (void)testBlock:(MyBlock)myBlock {
//讓執(zhí)行傳進(jìn)來的代碼塊
myBlock(10);
}
4) 在viewDidLoad中調(diào)用這個(gè)方法
1歪泳、第一種方式
MyBlock block = ^(int a){
return a;
};
[self testBlock:block];
2萝勤、第二種方式
[self testBlock:^int(int a) {
return a;
}];
三、blocks和變量
變量按作用域分有全局變量和局部變量呐伞,block代碼塊內(nèi)可以引用這兩種變量敌卓,但是有不同的管理機(jī)制
1、引用局部變量
block引用局部變量時(shí)伶氢,該變量會(huì)作為常量編碼到block塊中趟径。局部變量需要使用__block修飾,才能在block塊中修改癣防。
int number = 10;
MyBlock testBlock= ^(int a){
number = 20; //錯(cuò)誤不能重新賦值
NSLog(@"%d",number);
};
將int number = 10蜗巧,改為__block int number = 10,便可重新賦值
2、全局變量的話可以直接在block中賦值