淺析block及其實(shí)際應(yīng)用(一)

因?yàn)樽髡咭彩亲罱艑lock來電,所以理解可能會(huì)有些偏差.首先大概說一下block是個(gè)什么東西.block就像是一個(gè)匿名函數(shù)(就是一個(gè)沒有名字的函數(shù)).他得強(qiáng)大之處在于他可以在兩個(gè)對象之間傳遞數(shù)據(jù).他比函數(shù)引用傳遞來說更加直觀.比如和協(xié)議相比.block是閉合執(zhí)行的,這樣使他更加能捕獲周圍環(huán)境的狀態(tài).重點(diǎn)說一下,他是OC的一個(gè)對象.

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

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

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

    blockname(parameters list)

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

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

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

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

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

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

閉合性
說到這個(gè)就有寫難以理解,所以我會(huì)在代碼演示之后談?wù)勛约旱目捶?先來看代碼

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

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鞍恢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子禽作,更是在濱河造成了極大的恐慌,老刑警劉巖提前,帶你破解...
    沈念sama閱讀 211,496評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件李茫,死亡現(xiàn)場離奇詭異,居然都是意外死亡陨舱,警方通過查閱死者的電腦和手機(jī)械荷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評論 3 385
  • 文/潘曉璐 我一進(jìn)店門共耍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吨瞎,你說我怎么就攤上這事痹兜。” “怎么了颤诀?”我有些...
    開封第一講書人閱讀 157,091評論 0 348
  • 文/不壞的土叔 我叫張陵字旭,是天一觀的道長。 經(jīng)常有香客問我崖叫,道長遗淳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,458評論 1 283
  • 正文 為了忘掉前任心傀,我火速辦了婚禮屈暗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己养叛,他們只是感情好种呐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,542評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弃甥,像睡著了一般爽室。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淆攻,一...
    開封第一講書人閱讀 49,802評論 1 290
  • 那天阔墩,我揣著相機(jī)與錄音,去河邊找鬼瓶珊。 笑死啸箫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的艰毒。 我是一名探鬼主播筐高,決...
    沈念sama閱讀 38,945評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼丑瞧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蜀肘,我...
    開封第一講書人閱讀 37,709評論 0 266
  • 序言:老撾萬榮一對情侶失蹤绊汹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后扮宠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體西乖,經(jīng)...
    沈念sama閱讀 44,158評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,502評論 2 327
  • 正文 我和宋清朗相戀三年坛增,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了获雕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,637評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡收捣,死狀恐怖届案,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情罢艾,我是刑警寧澤楣颠,帶...
    沈念sama閱讀 34,300評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站咐蚯,受9級特大地震影響童漩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜春锋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,911評論 3 313
  • 文/蒙蒙 一矫膨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦侧馅、人聲如沸直奋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,744評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脚线。三九已至,卻和暖如春弥搞,著一層夾襖步出監(jiān)牢的瞬間邮绿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,982評論 1 266
  • 我被黑心中介騙來泰國打工攀例, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留船逮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,344評論 2 360
  • 正文 我出身青樓粤铭,卻偏偏與公主長得像挖胃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子梆惯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,500評論 2 348

推薦閱讀更多精彩內(nèi)容

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