淺析block及其實際應用(一)

因為作者也是最近才對block來電,所以理解可能會有些偏差.首先大概說一下block是個什么東西.block就像是一個匿名函數(shù)(就是一個沒有名字的函數(shù)).他得強大之處在于他可以在兩個對象之間傳遞數(shù)據(jù).他比函數(shù)引用傳遞來說更加直觀.比如和協(xié)議相比.block是閉合執(zhí)行的,這樣使他更加能捕獲周圍環(huán)境的狀態(tài).重點說一下,他是OC的一個對象.

創(chuàng)建Block與調(diào)用
正如我前面所說,block像是一個匿名函數(shù),所以它能夠?qū)崿F(xiàn)函數(shù)的所有功能.但同時他又是一個OC對象,所以他的定義兼有兩種風格

void (^block)() = ^{
        NSLog(@"hello world");
};

我們看一下Block的具體定義,這個時候我們可以發(fā)現(xiàn),他跟函數(shù)的定義幾乎一模一樣,只不過多了個^,同時具有對象的特征可以賦值.上面的代碼的意思就是定義了一個返回值為空,名為block的block對象,他的功能是打印"hello world";至于調(diào)用,和c語言一樣直接

    blockname(parameters list)

其實block的創(chuàng)建與調(diào)用沒什么難理解的,就是^讓人覺得很別扭,慢慢來,以后寫多了好了.

參數(shù)列表
正如上文而言,block當然可以用參數(shù).看一個簡單的列子,這里沒什么好說的.直接上例子

    void (^block)(NSString *) = ^(NSString *name){
          NSLog(@"hello %@", name);
    };
    block(@"Steve");

多個參數(shù)的讀者自己腦補一下,我相信你可以的.

返回值
其實原本這個我打算直接寫寫出來的,但是考慮到跟C函數(shù)還是有一點出入,我這里還是跟大家寫明白點.也希望能幫助到看篇文章的小白.在這里我要強調(diào)一點,一定要類比C語言函數(shù),如果你是直接入手的OC建議你看一點C語言.

    int (^sum)(int , int) = ^(int a, int b){
          return a + b;
    };
    NSLog(@"%d", sum(1, 2));

閉合性
說到這個就有寫難以理解,所以我會在代碼演示之后談談自己的看法.先來看代碼

    NSString *treat = @"Hi";
    NSString *(^sayHi)(NSString *) = ^(NSString *name){
        return [treat stringByAppendingFormat:@"%@", name];
    };
    NSLog(@"%@", sayHi(@"Steve"));  //HiSteve
    treat = @"Hello";
    NSLog(@"%@", sayHi(@"Steve")); //HiSteve

從上面的運行結(jié)果大家可以看到Block內(nèi)的非局部變量并沒有受到影響.其實這個實質(zhì)是當?shù)谝辉L問treat時并不是直接引用的變量,而是將變量copy一份,以常量的形式保存到block中.這個時候大家明白為什么值不會改變了吧.
這個時候聰明的你會想,如果我向直接獲取block內(nèi)的值,并且不想用Block返回值的方式.這個時候我在教你一招,在變量的前面+__blcok,如下

    __block int i = 0;
    int (^count)() = ^ {
        return i++;
    };
    NSLog(@"%d", count());   //0
    NSLog(@"%d", count());   //1
    NSLog(@"%d", count());   //2

在這里再說明一點,因為block在實際的運行過程會出現(xiàn)向堆區(qū)拷貝的情況,所以通常情況下,block會產(chǎn)生一些額外的運行的開銷.
明天還再說一下block做為類型和參數(shù)的使用.

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

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

  • 《Objective-C高級編程》這本書就講了三個東西:自動引用計數(shù)、block、GCD,偏向于從原理上對這些內(nèi)容...
    WeiHing閱讀 10,090評論 10 69
  • 前言 Blocks是C語言的擴充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了這...
    小人不才閱讀 3,863評論 0 23
  • 1.項目經(jīng)驗 2.基礎問題 3.指南認識 4.解決思路 ios開發(fā)三大塊: 1.Oc基礎 2.CocoaTouch...
    扶光啟玄閱讀 5,203評論 0 13
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,607評論 30 472
  • 冬至過后,氣溫降低,早晚溫差加大,昆明有些冬天的模樣了。今天活動的內(nèi)容是坐火車到離昆明40公里以外的小哨轉(zhuǎn)山、轉(zhuǎn)水...
    遠山墨雨閱讀 733評論 2 6

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