block初窺

一.block的簡(jiǎn)單使用

1.block聲明

block變量的聲明格式為: 返回值類型 (^block名字)(參數(shù)列表);

  • 聲明一個(gè)無返回值,有兩個(gè)NSString參數(shù),名字為ablock的block
    void (^ablock)(NSString * str1,NSString * str2);
  • 形參變量名可以省略,只留下形參類型
    void (^ablock)(NSString * ,NSString * );

2.block賦值

block的賦值格式為: ablock變量=^(參數(shù)列表){函數(shù)體} ;

    //1.在此先聲明一個(gè)名為ablock的block
    void (^ablock)(NSString * str1,NSString * str2);

    //2.在此將等號(hào)右邊的block代碼塊的實(shí)現(xiàn)賦值給ablock變量
    ablock = ^(NSString * str1,NSString * str2){
        NSLog(@"%@,%@",str1,str2);
    };

    //3.在這里調(diào)用ablock
    ablock(@"lisj",@"ddsd");

block 賦值格式
block變量 = ^返回值類型(參數(shù)列表){函數(shù)體};

  • 其中,返回值類型可以書省略,因?yàn)榫幾g器可以根據(jù)存儲(chǔ)代碼塊的變量中,確定返回值的類型.

3. 在聲明block的同時(shí)對(duì)其進(jìn)行賦值
  • 簡(jiǎn)化block的聲明和定義的過程,一步到位,直接調(diào)用即可
//1.聲明block,并定義
   int (^myblcok) (int,int) = ^ (int c,int d){
        return c*d;
   };
//2.有參數(shù)有返回值的block調(diào)用
    NSLog(@"%d", myblcok(4,5));//這里會(huì)在控制臺(tái)打印20
  • 如果沒有參數(shù)列表,賦值時(shí),參數(shù)列表可以省略
//1.無返回值無參數(shù)block的聲明及定義
 void (^oneblcok) () = ^ {
        NSLog(@"hello world ");//打印hello world
    };
//2.無參,無返回值block的調(diào)用
 oneblcok();

二.block的進(jìn)階使用

1.block作為C函數(shù)參數(shù)

  • 第一種語法
//1.聲明一個(gè)求和函數(shù)
    void  useBlockInC(int (^block)(int a ,int b)){
    NSLog(@"%d",block(30,30));
}

//2.定義一個(gè)block,用來實(shí)現(xiàn)求和的功能(主要邏輯部分,根據(jù)自己的需求在這里寫代碼)
    int (^addBlock)(int,int )=^(int x,int y){
        return  x+y;
    };

//3.調(diào)用函數(shù)
    useBlockInC(addBlock);
  • 第二種語法(第一種的簡(jiǎn)化版--常用)
    • 將第一種語法中的第2步和第3步結(jié)合起來,簡(jiǎn)化語法
//1.聲明一個(gè)求和函數(shù)(第一步相同)
    void  useBlockInC(int (^block)(int a ,int b)){
    NSLog(@"%d",block(30,30));
}

//
//簡(jiǎn)化,把2和3結(jié)合起來,簡(jiǎn)化之后如下方式
//示例1
    useBlockInC(^int(int a, int b) {
        return a*b;//這里的代碼邏輯根據(jù)項(xiàng)目需求寫,可靈活多變,只要符合語法
    });
//示例2
     useBlockInC(^int(int a, int b) {
        return a-b;//比如變成減法
    });

  • block用作函數(shù)參數(shù),相當(dāng)于傳進(jìn)來了一種數(shù)據(jù)類型,可以拿到相應(yīng)的參數(shù)來做自己想做的事.
  • block一般用作函數(shù)參數(shù)時(shí),多為無返回值類型.

2.block作為OC函數(shù)參數(shù)

  • 第一種語法
//1:寫自己需要用到block做參數(shù)的函數(shù)
-(void)useBlockInOC:(void (^)(NSDictionary * dic))block{
    block(@{@"name":@"myName is bob"});
}

//2:聲明一個(gè)block變量,并把具體的代碼塊賦值給block變量
    void (^dicBlock) (NSDictionary *) = ^(NSDictionary * dic){
        for (NSString * item in dic) 
        {
            NSLog(@"%@",item);  
        }
    };
//3:調(diào)用函數(shù),將block當(dāng)做參數(shù)傳入函數(shù)
    [self useBlockInOC:dicBlock];
    
  • 第二種語法
    • 簡(jiǎn)化版(第二步和第三步合并)
//1:寫自己需要用到block做參數(shù)的函數(shù)
-(void)useBlockInOC:(void (^)(NSDictionary * dic))block{
    block(@{@"name":@"myName is bob"});
}
//2.調(diào)用函數(shù),代碼塊內(nèi)寫邏輯代碼
    [self useBlockInOC:^(NSDictionary *dic) {
        NSLog(@"%@", [dic objectForKey:@"name"]);
    }];

3. 使用typedef 定義block類型,可以簡(jiǎn)化block在C中的使用

//第一步,使用typedef聲明block類型typeBlock
  typedef void (^typeBlcok) (NSArray *);

//第二步,創(chuàng)建一個(gè)block的變量,并把block的代碼塊賦值給這個(gè)新創(chuàng)建的變量
  typeBlcok newBlcok =^(NSArray * arr){
        for (id item  in arr) {
            NSLog(@"%@",item);
        }
    };

//第三步:調(diào)用block,記得傳入?yún)?shù)
    NSArray * arr=@[@"戰(zhàn)狼2",@"吳京",@"敦刻爾克",@"蜘蛛俠",@"極限挑戰(zhàn)",@"美麗的五險(xiǎn)",@"你好,佳人",@"成語大會(huì)",@"創(chuàng)業(yè)故事"];
    
    newBlcok(arr);//調(diào)用block


4.使用typedef簡(jiǎn)化block在OC中的使用方法

  • 第一種語法
//1.使用typeBlock聲明一種block的類型,簡(jiǎn)化block的用法
typedef void(^typeBlock) (NSDictionary * dic);

//2.寫自己需要的函數(shù)
-(void)useBlockInOC:(void (^)(NSDictionary * dic))block{
    block(@{@"name":@"myName is bob"});
}
//3.用聲明的typeBlock類型創(chuàng)建一個(gè)block變量,然后把具體的代碼塊賦值給對(duì)象
    typeBlock block = ^(NSDictionary *dic) {
        NSLog(@"%@", [dic objectForKey:@"name"]);
    };
    
//4.調(diào)用函數(shù),將block當(dāng)做參數(shù)傳入函數(shù)
    [self useBlockInOC:block];
    

  • 第二種語法
//1.使用typeBlock聲明一種block的類型,簡(jiǎn)化block的用法
typedef void(^typeBlock) (NSDictionary * dic);

//2.寫自己需要的函數(shù)
-(void)useBlockInOC2:(typeBlock)block{
    block(@{@"name":@"myName is bob"});
}
//3.調(diào)用函數(shù),簡(jiǎn)化版,代碼塊內(nèi)直接寫邏輯代碼
    [self useBlockInOC:^(NSDictionary *dic) {
        NSLog(@"%@", [dic objectForKey:@"name"]);
    }];

解釋:無論是C語言或者是OC語言,第二種語法最常用.第一種語法可以看做是第二種語法的來源或者原理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 Blocks是C語言的擴(kuò)充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了這...
    小人不才閱讀 3,881評(píng)論 0 23
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,628評(píng)論 30 472
  • 2.1 Blcoks概要 2.1.1 什么是Blocks Blocks是C語言的擴(kuò)充功能——“帶有自動(dòng)變量(即局部...
    SkyMing一C閱讀 2,455評(píng)論 6 18
  • 開篇 6.12 一些工作上的事,這段時(shí)間也差不多可以算告一段落了。翻了一下印象筆記App里2017年閱讀記錄,20...
    池中泛舟閱讀 792評(píng)論 0 0
  • 你好,黃山。 去之前,一直在打算著,看云??慈粘?,看看不一樣的風(fēng)景。 在火車上,就迫不及待的看了一場(chǎng)日出。微茫的太...
    可嘻可樂閱讀 808評(píng)論 0 0

友情鏈接更多精彩內(nèi)容