一、block的應用場景
1、對象與對象之間的通信方式
1)代理-協議,1對1
2)通知,1對多
3)block,1對1,但不需要協議
2、block介紹
block是iOS4.0之后新增的一種語法結構,也稱為閉包,block是一個匿名的函數代碼塊,此代碼塊可以作為參數傳遞給其他對象
PS:每一個block都是一個可以有參數和返回值的方法
二、block的使用
1、簡單使用
1)block變量的聲明,類似聲明一個普通對象
返回值? block變量? ? 參數
int? (^ myBlocks)(int a);
2)block的創建,類似將一個對象給實例化
myBlocks= ^(int a){
int result = a * a;
return result;
};
3)block的調用,類似使用對象
int ret = myBlocks(10);
2、上一種方式每次我要使用一個block變量都需要聲明否則會直接將之前的覆蓋掉,為了方法我們可以定義一種blcok類型,用這種block類型來聲明多個類似的block變量
1) 定義block類型
typedef int (^MyBlock)(int a);
2) 創建block對象
MyBlock myBlock = ^(int a){
int result = a * a;
return result;
};
3)? block的調用
int ret = myBlocks(10);
三、block作為參數
之前我們都是將字符串、字典、數組等作為參數傳遞,沒有過將某一個方法做為參數傳遞,今天就通過block將參數傳進來
1) 定義block類型
typedef int (^MyBlock)(int a);
2) 在延展中聲明一個方法,該方法有一個block參數
- (void)objectMethod:(MyBlock)myblock
3) 在類中實現這個方法
- (void)testBlock:(MyBlock)myBlock {
//讓執行傳進來的代碼塊
myBlock(10);
}
4) 在viewDidLoad中調用這個方法
1、第一種方式
MyBlock block = ^(int a){
return a;
};
[self testBlock:block];
2、第二種方式
[self testBlock:^int(int a) {
return a;
}];
三、blocks和變量
變量按作用域分有全局變量和局部變量,block代碼塊內可以引用這兩種變量,但是有不同的管理機制
1、引用局部變量
block引用局部變量時,該變量會作為常量編碼到block塊中。局部變量需要使用__block修飾,才能在block塊中修改。
int number = 10;
MyBlock testBlock= ^(int a){
number = 20; //錯誤不能重新賦值
NSLog(@"%d",number);
};
將int number = 10,改為__block int number = 10,便可重新賦值
2、全局變量的話可以直接在block中賦值