iOS 鏈?zhǔn)骄幊坛跆?/h1>

  • 鏈?zhǔn)骄幊?/p>

  • Masonry 打點(diǎn)調(diào)用原理

    之前一直好奇Masonry 框架是怎樣實(shí)現(xiàn)的撩荣,可以一直打點(diǎn)調(diào)用削罩,語法使用起來非常友好烙常,結(jié)合其他開發(fā)者博客理解了打點(diǎn)調(diào)用實(shí)現(xiàn)原理荆永,下面用一個(gè)計(jì)算器實(shí)現(xiàn)類來說明一下。

- 準(zhǔn)備工作:
創(chuàng)建 CaculatorMaker : NSObject 類

@interface CaculatorMaker : NSObject
// 用于存放計(jì)算結(jié)果
@property (nonatomic, assign) int result;

@end
1. 平常習(xí)慣的寫法是這樣的:
- (instancetype)add:(int)num{
    self.result = self.result + num;
    return self;
}

在外部調(diào)用:
CaculatorMaker *make = [CaculatorMaker new];
int result = [[[[make add:10] add:20] add:30] result] ;

可以看到如果調(diào)用計(jì)算次數(shù)過多般渡,代碼可讀性很差懒豹,解決辦法:參考Masonry 寫法試一下。

2. 模仿 Mansonry風(fēng)格寫一下

首先如果Mansonry 點(diǎn)進(jìn)庫里看的話驯用,可以看到他的點(diǎn)語法是通過 block 來實(shí)現(xiàn)的脸秽,此處來模仿一下:
(1)定義一個(gè)簡單的無參無返回的block調(diào)用

.h 文件聲明:
- (void(^)())add

.m 方法中實(shí)現(xiàn):
-(void (^)())add{
  return ^(){
      NSLog(@"block 調(diào)用啦");
  };
}

外界調(diào)用:
CaculatorMaker *make = [CaculatorMaker new];
(1)NSObject *objc = make.add;
這時(shí)候斷點(diǎn)看一下 objc 類型:
po objc
<__NSGlobalBlock__: 0x102a8e0b0>
可以清楚的看到他是一個(gè) block 類型,因此我直接調(diào)用block
make.add(); 就可以看到上面在定義block 時(shí)候的打印
“block 調(diào)用啦”

至此打點(diǎn)調(diào)用語法已經(jīng)說明完畢蝴乔,總結(jié)一下就是:
聲明一個(gè) get 方法豹储,返回的是一個(gè) block,外界調(diào)用block淘这。

(2)點(diǎn)語法有了,那么他又是如何實(shí)現(xiàn)計(jì)算的呢巩剖?
在剛才block的基礎(chǔ)上我們需要傳一個(gè)參數(shù)

.h 文件聲明:
- (void(^)(int))add;

.m 方法中實(shí)現(xiàn):
-(void (^)(int))add{
    return ^(int num){
        self.result = self.result + num;
        NSLog(@"block 調(diào)用, result==%d", self.result);
    };
}

外界調(diào)用:
CaculatorMaker *make = [CaculatorMaker new];
make.add(10);
make.add(20);
make.add(30);
打印如下:
block 調(diào)用, result==10
block 調(diào)用, result==30
block 調(diào)用, result==60

此時(shí)已初步完成打點(diǎn)調(diào)用完成計(jì)算铝穷;但是存在兩個(gè)問題:
(1)計(jì)算結(jié)果只在 CaculatorMaker 內(nèi)部,我在外界調(diào)用時(shí)候不能直接拿到計(jì)算結(jié)果佳魔;
(2)無法像Masonry那樣可以連續(xù)打點(diǎn)調(diào)用曙聂,此處每計(jì)算一次就得調(diào)用一次方法。

為解決上面兩個(gè)問題鞠鲜,顯然我在計(jì)算完成的同時(shí)需要拿到 make 對(duì)象宁脊,計(jì)算結(jié)果就是 make對(duì)象的 result 屬性,有了make對(duì)象我就可以繼續(xù)打點(diǎn)調(diào)用贤姆。
在剛才add方法的基礎(chǔ)上我返回一個(gè)有返回值的block榆苞,這個(gè)block的返回值就是 make對(duì)象,如下:

.h 文件聲明:
- (CaculatorMaker* (^)(int))add;

.m 方法中實(shí)現(xiàn):
-(CaculatorMaker* (^)(int))add{
    return ^(int num){
        self.result = self.result + num;
        NSLog(@"block 調(diào)用, result==%d", self.result);
        return self;
    };
}

外界調(diào)用:
CaculatorMaker *make = [CaculatorMaker new];
NSObject *objc = make.add(10).add(20).add(30);
此時(shí)查看 objc 類型
po objc
<CaculatorMaker: 0x608000018830>
可以看到是 CaculatorMaker 類型的一個(gè)對(duì)象霞捡,此時(shí)我可以通過他的 result屬性來獲取計(jì)算結(jié)果坐漏,那么最終我在外界調(diào)用計(jì)算方法并且拿到計(jì)算結(jié)果就是這樣的:
int result = make.add(10).add(20).add(30).result;

至此連續(xù) Mansonry 連續(xù)打點(diǎn)調(diào)用實(shí)現(xiàn)的基本原理已經(jīng)說明完畢,結(jié)合上面的小 Demo 總結(jié)一下就是:

  • 通過block 代碼塊去保存一段代碼,此處是計(jì)算過程代碼赊琳;
  • block 是一個(gè)有參數(shù)又返回值的block街夭,參數(shù)就是我們需要參與計(jì)算值的,返回值是 計(jì)算器構(gòu)造對(duì)象 make躏筏,有了返回值make對(duì)象板丽,方便我們進(jìn)行下一個(gè)計(jì)算。

擴(kuò)展一下趁尼,如果我們想在任意一個(gè)類中都可以方便的調(diào)用計(jì)算方法的話埃碱,可以通過分類來實(shí)現(xiàn),代碼如下:

#import <Foundation/Foundation.h>
@class CaculatorMaker;

@interface NSObject (Caculator)

+ (void)add:(void(^)(CaculatorMaker *make))block;

@end

#import "NSObject+Caculator.h"
#import "CaculatorMaker.h"

@implementation NSObject (Caculator)

+ (void)add:(void(^)(CaculatorMaker *))block{
     CaculatorMaker *make = [CaculatorMaker new];
    block(make);
}

@end

外界調(diào)用時(shí)候就是這樣的:

    [NSObject add:^(CaculatorMaker *make) {
        int result = make.add(5).add(6).add(18).result;
        NSLog(@"result___%d",result);

    }];

如有不對(duì)的地方弱卡,歡迎大家指正

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末乃正,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子婶博,更是在濱河造成了極大的恐慌瓮具,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凡人,死亡現(xiàn)場離奇詭異名党,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)挠轴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門传睹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岸晦,你說我怎么就攤上這事欧啤。” “怎么了启上?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵邢隧,是天一觀的道長。 經(jīng)常有香客問我冈在,道長倒慧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任包券,我火速辦了婚禮纫谅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘溅固。我一直安慰自己付秕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布侍郭。 她就那樣靜靜地躺著盹牧,像睡著了一般俩垃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上汰寓,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天口柳,我揣著相機(jī)與錄音,去河邊找鬼有滑。 笑死跃闹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的毛好。 我是一名探鬼主播望艺,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肌访!你這毒婦竟也來了找默?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤吼驶,失蹤者是張志新(化名)和其女友劉穎惩激,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蟹演,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡风钻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酒请。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骡技。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖羞反,靈堂內(nèi)的尸體忽然破棺而出布朦,到底是詐尸還是另有隱情,我是刑警寧澤昼窗,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布是趴,位于F島的核電站,受9級(jí)特大地震影響膏秫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜做盅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一缤削、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吹榴,春花似錦亭敢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽让腹。三九已至,卻和暖如春扣溺,著一層夾襖步出監(jiān)牢的瞬間骇窍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工锥余, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腹纳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓驱犹,卻偏偏與公主長得像嘲恍,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雄驹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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