Object_C 回顧 0.1.2 block函數

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基於兩大理由,是傳統回調函數的優秀替代品:

  1. 允許你把具體實現代碼寫在調用該方法的地方. Blocks也經常是framework的方法參數.    
  2. 可以訪存局部變量. 不需要像以前的回調一樣,把在操作後所有需要用到的數據封裝成特定的數據結構, 你完全可以直接訪問局部變量.
(使用block不需要你去聲明定義後再使用,隨時定義隨時使用,可以嵌套,在函數中進行定義和引用,關於block,我也許會說一大堆來講block的定義,說它的優點,工作原理如何...總之一句話就可以了,用block吧,用它方便快捷,這就足夠了)


如何使用:

//重定義一下
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>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章