iOS開發(fā)基礎(chǔ):開發(fā)兩年的你也不會寫的Block

閱讀本文之前,請嘗試寫出以下問題:

  1. 聲明一個Block困檩,并調(diào)用它。
  2. 聲明一個Block型的屬性那槽。
  3. 聲明一個方法悼沿,接受一個Block型的參數(shù),并寫出調(diào)用時傳入的Block實參倦炒。
  4. 實現(xiàn)一個Block的遞歸調(diào)用(Block調(diào)用自己)显沈。
  5. 實現(xiàn)一個方法,將Block作為返回值逢唤。

現(xiàn)在拿出筆紙,關(guān)上屏幕涤浇,20分鐘后見...


歡迎回來鳖藕!如果你未能寫出以上問題的答案,本文將給你答案只锭。

本文使用以下符號著恩,含義列舉如下:

  • return_type 表示返回的對象/關(guān)鍵字等(通常是void)
  • blockName 表示block的名稱
  • var_type 表示參數(shù)的類型
  • varName 表示參數(shù)名稱

聲明一個Block,作為局部變量:

return_type (^blockName)(var_type) = ^return_type (var_type varName) {
    // ...
};
blockName(var);

聲明一個Block型的屬性

注意與局部變量的聲明比較蜻展,有細(xì)微差別喉誊,你能指出嗎?

@property (copy) return_type (^blockName) (var_type);

在定義方法時纵顾,聲明Block型的形參

這里提供的是Block的定義

- (void)yourMethod:(return_type (^)(var_type))blockName;

Block作為實參

調(diào)用方法時伍茄,傳入Block,這里需要的是Block的具體實現(xiàn)

[someObject doSomethingWithBlock: ^return_type (var_type varName)
{
    //...
}];

如果已經(jīng)定義了局部變量的Block施逾,也可以直接傳入名稱敷矫。

匿名Block

Block實現(xiàn)時例获,如上文的局部變量和實參,等號右邊就是一個匿名Block曹仗,它沒有blockName

^return_type (var_type varName)
{
    //...
};

typedef Block

利用typedef簡化Block的聲明:

typedef return_type (^BlockTypeName)(var_type);

然后可用BlockTypeName定義Block榨汤,類似類名的使用方法:

BlockTypeName aBlock = ^return_type (var_type) {
    //...
}

內(nèi)聯(lián) Block

這種形式并不常用,匿名Block聲明后立即被調(diào)用:

^return_type (var_type varName)
{
    //...
}(var);

內(nèi)聯(lián) Block可用于代碼分塊怎茫,提高代碼可讀性收壕,功能類似大括號的代碼塊,其它功能非常有限:

{
   //...
}

遞歸調(diào)用Block

Block內(nèi)部調(diào)用自身轨蛤,遞歸調(diào)用是很多算法基礎(chǔ)蜜宪,特別是在無法提前預(yù)知循環(huán)終止條件的情況下。注意 由于Block內(nèi)部引用了自身俱萍,這里必須使用__block避免保留環(huán)問題端壳。

__block return_type (^blockName)(var_type) = [^return_type (var_type varName)
{
    if (returnCondition)
    {
        blockName = nil;
        return;
    }
    // ...
    blockName(varName);
} copy];
blockName(varValue);

Block作為返回值

方法的返回值是一個Block,可用于一些“工廠模式”的方法中:

- (return_type(^)(var_type))methodName
{
    // ...
}

如果你發(fā)現(xiàn)本文沒有列舉的Block寫法枪蘑,歡迎指出损谦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市岳颇,隨后出現(xiàn)的幾起案子照捡,更是在濱河造成了極大的恐慌,老刑警劉巖话侧,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栗精,死亡現(xiàn)場離奇詭異,居然都是意外死亡瞻鹏,警方通過查閱死者的電腦和手機(jī)悲立,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來新博,“玉大人薪夕,你說我怎么就攤上這事『涨模” “怎么了原献?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長埂淮。 經(jīng)常有香客問我姑隅,道長,這世上最難降的妖魔是什么倔撞? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任讲仰,我火速辦了婚禮,結(jié)果婚禮上误窖,老公的妹妹穿的比我還像新娘叮盘。我一直安慰自己秩贰,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布柔吼。 她就那樣靜靜地躺著毒费,像睡著了一般。 火紅的嫁衣襯著肌膚如雪愈魏。 梳的紋絲不亂的頭發(fā)上觅玻,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音培漏,去河邊找鬼溪厘。 笑死,一個胖子當(dāng)著我的面吹牛牌柄,可吹牛的內(nèi)容都是我干的畸悬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼珊佣,長吁一口氣:“原來是場噩夢啊……” “哼蹋宦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起咒锻,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤冷冗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后惑艇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒿辙,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年滨巴,在試婚紗的時候發(fā)現(xiàn)自己被綠了思灌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡恭取,死狀恐怖习瑰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情秽荤,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布柠横,位于F島的核電站窃款,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏牍氛。R本人自食惡果不足惜晨继,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搬俊。 院中可真熱鬧紊扬,春花似錦蜒茄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至腹缩,卻和暖如春屿聋,著一層夾襖步出監(jiān)牢的瞬間党晋,已是汗流浹背阔加。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工腺办, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留谭贪,地道東北人锡搜。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓磕诊,卻偏偏與公主長得像哮兰,于是被迫代替她去往敵國和親结缚。 傳聞我的和親對象是個殘疾皇子竿痰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

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