OC中block的使用:
block:Block對象提供了創建特殊函數的方法,函數體可用C,Objective-C,C++等C類的語言做表達式. 在其他的語言環境中,block變量可能會被叫做"閉包(closure)", 而在這裏,除非和標準C術語的一段(block)代碼混淆的情況之外,一般稱爲"blocks"。(前面不拉不拉一大堆的意思是你不需要懂,你只要知道就行了,關於block的定義可以去看官方的API)。
爲何要使用block
一個block就是一塊匿名的代碼塊:
- 和函數一樣有含類型的參數列表
- 有直接聲明或可推斷出的返回值
- 可以獲得當前詞法範圍的狀態
- 有能力修改當前詞法範圍的狀態
- 可以和當前詞法範圍的其他block共同修改狀態
- 可以持續共享和修改當前詞法範圍的狀態,甚至在當前詞法範圍銷燬之後
你可以copy一個block還可以將其傳到別的線程以延後執行 (或本線程的執行循環裏). 編譯器和運行時會把block裏用到的所有變量保存到該block的所有拷貝的生存期後。儘管blocks可以由純C或C++寫成,但block本身始終是一個Objective-C變量.
優點:
blocks基於兩大理由,是傳統回調函數的優秀替代品:
- 允許你把具體實現代碼寫在調用該方法的地方. Blocks也經常是framework的方法參數.
- 可以訪存局部變量. 不需要像以前的回調一樣,把在操作後所有需要用到的數據封裝成特定的數據結構, 你完全可以直接訪問局部變量.
如何使用:
//重定義一下
typedef float (^BlockType) (float,float);
<span style="font-family:FangSong_GB2312;font-size:14px;">//block變量的定義 和 block 語法塊的實現
//在Block中 有一個"^" 起標識作用
//block 語法塊 其實就是一個匿名函數,他相比較其它函數 可以進行函數嵌套定義
void(^sayHiBlock)() = ^ void ()
{
NSLog(@"認識我嗎?");
};//定義了一個數據類型 void(^)() ,變量名爲 sayHiBlock ,初值爲 ^void (){NSLog(@"認識我嗎?");} 的一個block 變量
//block的使用
sayHiBlock();
//求兩個數之和 的block
int (^sumValueBlock)(int,int) = ^ int (int a,int b){
return a + b;
};
int max = sumValueBlock (5,6);
NSLog(@"sum = %d",max);
//求兩個數只差
int(^subBlock)(int, int) = ^ int (int a, int b)
{
return a - b;
};
NSLog(@"%d",subBlock(16,11));
int (^exchengeBlock)(NSString *) = ^ int (NSString *a)
{
return [a intValue];
};
NSLog(@"%d",exchengeBlock(@"1232131"));
//加
BlockType sumBlock = ^float (float a,float b){
return a + b;
};
NSLog(@"和 = %.2f",sumBlock(5,4));
//減
BlockType subBlock1 = ^float (float a, float b){
return a - b;
};
NSLog(@"差 = %.2f",subBlock1(9,17));
//乘
BlockType mulBlock = ^float (float a, float b){
return a * b;
};
NSLog(@"積 = %.2f",mulBlock(19,7));
//除
BlockType divBlock = ^float (float a, float b){
return a / b;
};
NSLog(@"商 = %.2f",divBlock(9,7));</span>
<span style="font-family:FangSong_GB2312;font-size:14px;">// //__block 告訴編譯器 將所修飾的變量 在block 內部仍然識別爲可以改變的量 弱引用
__block int a = 10;
int (^testBlock)() = ^int (){
a = 15; //對於局部變量 在block 內部被識別爲 不可改變的的量
b ++; //對於全局變量 在block 內仍然識別爲變量
NSLog(@"a = %d",a);
NSLog(@"b = %d",b);
return a;
};
testBlock();</span>
Tips:
<span style="font-family:FangSong_GB2312;font-size:14px;"> //NSString
NSString *str = @"糖";
NSMutableString *muSet = [NSMutableString stringWithFormat:@"%@",str];
NSArray *arr = @[@"1",@"2",@"3"];
//等價於 [NSArray arrayWithObjects: @"1",@"2",@"3",nil];
NSMutableArray *muArr = [NSMutableArray arrayWithArray:arr];
[arr objectAtIndex:1];
arr[1];
//字典 NSDictionary
NSDictionary *dic = @{@"name1": @"笑笑語法",@"name2":@"語法糖",@"name3":@"字面量"};
NSLog(@"%@",dic);
NSLog(@"%@",dic[@"name3"]); //等價於 [dic valueForKey:@"name3"];
NSMutableDictionary *muDic = [NSMutableDictionary dictionaryWithDictionary:dic];
//NSNumber
NSNumber *num = @12;// [NSNumber numberWithInt:12];
</span>