OC-Block的高級用法

前面簡單的說了Block可以作為屬性属瓣,方法參數(shù)和方法返回使用讯柔。這里更加詳細(xì)的介紹一下Block魂迄,并且結(jié)合實際情況對Block進(jìn)行使用。

  • 什么是Block

Block又稱作是閉包极祸、塊遥金。這兩種概念又是什么呢蒜田?

Block是一種函數(shù),這種函數(shù)在別的函數(shù)內(nèi)部存在美莫,并且可以使用其所在函數(shù)內(nèi)的局部變量梯捕。

希望這樣的解釋稍微容易理解一些。

  • Block的寫法和調(diào)用

在xcode里面襟铭,可以輸入inlineBlock獲取Block的基本寫法:

returnType(^blockName)(parameterTypes) = ^(parameters) {
        statements
};

調(diào)用的時候寒砖,直接使用名字加一對小括號就可以了:

blockName ();

但是這個地方有一個坑,它省略了等號后面的返回類型哩都。一般情況下沒有什么問題漠嵌,但是如果返回的是nil咐汞,編譯器就會報錯。如下圖:

我們只要在等號后面加上對應(yīng)的返回值献雅,即可編譯通過碉考。

所以嚴(yán)格意義上,等號后面也應(yīng)該有返回類型挺身。

  • Block在實際開發(fā)中的使用

我們先定義一個類侯谁,叫Person。

1. block作為屬性
給我們之前定義的person類增加一個屬性:

//對Block的修飾:MRC用copy章钾,ARC用Strong
@property (nonatomic, strong) void(^eat)(void);

然后測試一下:

    Person *p = [Person new];
    //Block作為屬性
    p.eat = ^{
        NSLog(@"吃飯了墙贱!");
    };
    _p = p;

調(diào)用:
_p.eat();
控制臺輸出:
吃飯了

2. block作為方法參數(shù)

還是給之前的Person類增加一個新的方法:

.h
//Block作為參數(shù)時贱傀,blockname不需要寫在^后面惨撇,直接寫在括號后面
- (void)eatWith:(void(^)(void))block;

.m
- (void)eatWith:(void (^)(void))block {
    block();
}

測試代碼:

//Block作為方法參數(shù)
    [_p eatWith:^{
        NSLog(@"吃了一頓大餐!");
    }];

控制臺輸出:
吃了一頓大餐

3. block作為方法的返回值

.h
//Block作為返回值
- (void(^)(int i))run;

.m
- (void(^)(int i))run {
    return ^(int i){
        NSLog(@"我走了%d米",i);
    };
}

測試調(diào)用:

void(^block)(int i)= _p.run;
block(1);

//上面這兩行代碼可以合并為下面這一行
_p.run(1);//有沒有發(fā)現(xiàn)這個調(diào)用和block作為屬性時是一樣的府寒,下面會繼續(xù)分析

控制臺輸出:
我走了1米

  • 關(guān)于Block用法的引申思考

在前面魁衙,我們簡單的運(yùn)用了block的幾種使用場景,但是在使用過程中株搔,逐漸體會到了block的神奇剖淀。

1. 函數(shù)式編程

把Block當(dāng)做函數(shù)的參數(shù),可以把我們的邏輯和函數(shù)放在調(diào)用時候的block里面纤房,而不是方法內(nèi)部纵隔。這樣會讓我們在寫代碼的時候,把相關(guān)的邏輯都放在一起炮姨,提高了開發(fā)效率和程序的可讀性捌刮。這其實就是函數(shù)式編程思想清女。函數(shù)式編程在很多第三方框架中都有明顯的體現(xiàn)与境,比如說我們頻繁使用的AFNetWorking、Masonry等骤竹。

我們這里對Masonry框架進(jìn)行一些簡單的分析蛾派。
Masonry是一個輕量級的布局框架棚蓄。這是一個非常簡單并且常見的Masonry框架的運(yùn)用:

[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.edges.equalTo(superview).with.insets(padding);
}];
2.鏈?zhǔn)秸{(diào)用

外面的block就是一個函數(shù)式編程的體現(xiàn)堕扶,但是我們看到它在Block內(nèi)部調(diào)用方法的時候,不是像我們使用常規(guī)的OC語言一樣梭依,而是不斷地使用點語法調(diào)用稍算,極大的精簡了代碼量,同時也擁有很好的可讀性役拴,使用起來極其方便糊探。這種方式叫鏈?zhǔn)秸{(diào)用

那么結(jié)合我們剛剛對block的使用河闰,鏈?zhǔn)秸{(diào)用時怎么實現(xiàn)的呢科平?

  • 后面帶括號,說明方法的返回值是一個Block姜性。
  • 調(diào)用方法肯定是對象才可以進(jìn)行調(diào)用瞪慧,說明Block的返回值是一個對象。
  • 點語法則說明這個方法沒有參數(shù)部念。

結(jié)合以上三點思考弃酌,我們可以得出一個結(jié)論,一個沒有參數(shù)&有返回值&返回值是Block&Block的返回值是方法的調(diào)用者的方法儡炼,就可以實現(xiàn)鏈?zhǔn)秸{(diào)用:

.h
//鏈?zhǔn)秸{(diào)用方法
- (Person *(^)(NSString *city))travel;

.m
- (Person *(^)(NSString *))travel {
    return ^(NSString *city){
        NSLog(@"我去了%@",city);
        return self;
    };
}

測試一下:

//鏈?zhǔn)秸{(diào)用
_p.travel(@"重慶").travel(@"北京");

控制臺輸出:

我去了重慶
我去了北京

這樣我們就實現(xiàn)了鏈?zhǔn)秸{(diào)用妓湘。

函數(shù)式編程和鏈?zhǔn)秸{(diào)用就是Masonry用到的主要思想。我用這兩種思想乌询,寫了一個簡單的計算器榜贴。可以通過鏈?zhǔn)秸{(diào)用的方式做運(yùn)算妹田,代碼和之前的demo都放在git上點擊前往唬党。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鬼佣,隨后出現(xiàn)的幾起案子驶拱,更是在濱河造成了極大的恐慌,老刑警劉巖沮趣,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屯烦,死亡現(xiàn)場離奇詭異坷随,居然都是意外死亡房铭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門温眉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缸匪,“玉大人,你說我怎么就攤上這事类溢×枋撸” “怎么了露懒?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長砂心。 經(jīng)常有香客問我懈词,道長,這世上最難降的妖魔是什么辩诞? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任坎弯,我火速辦了婚禮,結(jié)果婚禮上译暂,老公的妹妹穿的比我還像新娘抠忘。我一直安慰自己,他們只是感情好外永,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布崎脉。 她就那樣靜靜地躺著,像睡著了一般伯顶。 火紅的嫁衣襯著肌膚如雪囚灼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天砾淌,我揣著相機(jī)與錄音啦撮,去河邊找鬼。 笑死汪厨,一個胖子當(dāng)著我的面吹牛赃春,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播劫乱,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼织中,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了衷戈?” 一聲冷哼從身側(cè)響起狭吼,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎殖妇,沒想到半個月后刁笙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡谦趣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年疲吸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片前鹅。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡摘悴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舰绘,到底是詐尸還是另有隱情蹂喻,我是刑警寧澤葱椭,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站口四,受9級特大地震影響孵运,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蔓彩,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一掐松、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粪小,春花似錦大磺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逞壁,卻和暖如春流济,著一層夾襖步出監(jiān)牢的瞬間绳瘟,已是汗流浹背糖声。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工嘲玫, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留去团,地道東北人土陪。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓乔遮,卻偏偏與公主長得像蹋肮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子漆魔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

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

  • 《Objective-C高級編程》這本書就講了三個東西:自動引用計數(shù)系瓢、block欠拾、GCD藐窄,偏向于從原理上對這些內(nèi)容...
    WeiHing閱讀 9,810評論 10 69
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫撤缴、插件腹泌、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,102評論 4 62
  • 在這金秋八月,我們在開學(xué)之季,迎來了初中生活的第一個考驗——軍訓(xùn)棺耍。 我懷著好奇的心情蒙袍,伴著清晨清脆的哨音消恍,迎來...
    姚柯帆閱讀 532評論 0 0
  • R 先問一個小問題后問大問題
    ZhangYY閱讀 130評論 0 0
  • 『離線思考』 調(diào)查顯示:手機(jī)平均每天要被解鎖110次,每過6、7分鐘蹂午,就會放下手里的工作,去看一次手機(jī),分散了注意...
    令芳老師閱讀 228評論 0 4