鏈式編程在iOS開發中的應用
前言先來了解下開發過程中常常接觸的幾個編程思想:面向過程:處理事情以過程為核心,一步一步的實現。函數式編程思想:是把操作盡量寫成
前言
先來了解下開發過程中常常接觸的幾個編程思想:
- 面向過程:處理事情以過程為核心,一步一步的實現。
- 函數式編程思想:是把操作盡量寫成一系列嵌套的函數或者方法調用。
函數式編程特點:每個方法必須有返回值(本身對象),把函數或者Block當做參數,block參數(需要操作的值)block返回值(操作結果) 代表:ReactiveCocoa
- 面向對象:萬物皆對象
面向對象對比面向過程的優勝之處在于,名詞化的概念比動詞化的描述,更便于人類理解。 這也是相比函數式編程的主要優點,許多函數是難以命名的,但對象卻很容易。 回顧下封裝、繼承、多態。
封裝是為了更好的重用性、可擴展性,但要綜合考慮性能問題,即使新增了判斷也會增加性能,只是不會量級的增加。 比如簡單工廠和抽象工廠(反射機制)的封裝,會增加性能的消耗。但把對象的管理變成了可配置化。
- 鏈式編程思想:將多個操作(多行代碼)通過點號(.)鏈接在一起成為一句代碼,使代碼可讀性好a(1).b(2).c(3)。
鏈式編程特點:方法的返回值是block,block必須有返回值(本身對象),block參數(需要操作的值) 代表:masonry框架
p.run() <=> [p run]();//執行方法的同時之后,立即執行方法返回的blockn
- 響應式編程思想:不需要考慮調用順序,只需要知道考慮結果,類似于蝴蝶效應,產生一個事件,會影響很多東西,這些事件像流一樣的傳播出去,然后影響結果,借用面向對象的一句話,萬物皆是流。
代表: a. KVO 是 Objective-C 對觀察者模式(Observer Pattern)的實現,也是 Cocoa Binding 的基礎。當被觀察對象的某個屬性發生更改時,觀察者對象會獲得通知。 b. Reactive Cocoa框架
查看原文關注公眾號【iOS逆向】
I 、鏈式編程的例子
1.1 實現鏈式編程的兩種形式
- 聲明屬性,屬性的類型是block,block必須有返回值(本身對象),block參數(需要操作的值)
聲明方法: 缺點就是 Xcode提示不太友好。不推薦
本質都是一樣的,就是執行(getter)方法之后,得到一個block,block必須有返回值(本身對象),block參數(需要操作的值)
1.2 通過聲明方法形式實現鏈式編程
缺點就是 Xcode提示不太友好。不推薦`
block 實現鏈式編程的例子1:(將block和method的特性 結合起來) https://github.com/zhangkn/DKUsingblockImplementChainProgramming
直接聲明方法的返回值是block,block必須有返回值(本身對象),block參數(需要操作的值)
例子: p.run() <=> [p run]() 效果:p.run() <=> [p run]();// 執行方法的同時之后,立即執行方法返回的block。
int main(int argc, const char * argv[]) {n @autoreleasepool {n // insert code here...n //使用block實現鏈式編程n People *p= [[People alloc]init];n// p.run() <=> [p run]();// 執行方法的同時之后,立即執行方法返回的block。n p.run().study();n n p.run().name(@"將block和method的特性 結合起來");n n n }n return 0;n}n
代碼的實現
#import "People.h"nn@implementation Peoplenn- (People *(^)())run{n return ^{n NSLog(@"run");n return self;n };// 返回一個blockn}nnn- (People *(^)())study{n return ^{n NSLog(@"study");n return self;n };// 返回一個blockn}nnn- (People *(^)(NSString *))name{n return ^(NSString *name){n NSLog(@"%@",name);n return self;n };n}nn
1.3 通過聲明屬性形式實現鏈式編程
聲明屬性,屬性的類型是block,block必須有返回值(本身對象),block參數(需要操作的值)
聲明屬性: 本質就是利用他的getter方法
完整SDK源碼【封裝富文本API,采用block實現鏈式編程】(block 的妙用:結合block和方法的優點實現iOS的鏈式編程)
- 文章:https://blog.csdn.net/z929118967/article/details/107835195
- 從CSDN資源下載完整SDK代碼:https://download.csdn.net/download/u011018979/14038715
- 部分API

- 用法例子



NSMutableAttributedString *xx = [[NSMutableAttributedString alloc]init];n n n xx.kn_addString(@"封裝富文本API").kn_fontColor(UIColor.redColor).kn_addString(@"采用block實現鏈式編程").kn_fontColor(UIColor.blueColor).kn_addString(@"!");nn
https://github.com/zhangkn/ChainAttributedString
以Masonry 框架為例子,進行分析
調用的equalTo:方法 返回的就是一個返回值為MASConstraint的block
- (MASConstraint * (^)(id))equalTo { return ^id(id attribute) { return self.equalToWithRelation(attribute, NSLayoutRelationEqual); }; }n
用法
- (UIImageView *)imgForReason{n n if (nil == _imgForReason) {n n n n UIImageView *img2 = [[UIImageView alloc] init];n n _imgForReason = img2;n n [self addSubview:_imgForReason]; n n [img2 mas_makeConstraints:^(MASConstraintMaker *make) {n n make.left.equalTo(self.mas_left).offset(25);n n make.top.equalTo(self.imgForPassword.mas_bottom).offset(12);n n make.size.mas_equalTo(CGSizeMake(kScreenWidth-100, 76));n n n n }];n n n n }n n return _imgForReason;n n}n
II、函數式編程總結
- 如果想再去調用別的對象方法,那么就需要返回一個對象;
- 如果想用()去執行,那么需要返回一個block;
- 如果想讓返回的block再調用對象的方法,那么這個block就需要返回一個對象(即 返回值為一個對象的block)。
更多編程思想請到#公眾號:iOS逆向交流
see also
iOS富文本&圖文混排的使用指南
1、封裝富文本API,采用block實現鏈式編程
2、 超鏈接屬性
3、HTML字符串與富文本互轉
4、創建帶有圖片的富文本
————————————————
版權聲明:本文為CSDN博主「#公眾號:iOS逆向」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/z929118967/article/details/114014827
開閉原則
一個軟件實體如類,模塊和函數應該對擴展開放,對修改關閉。
Software entities like classes,modules and functions should be open for extension but closed for modifications. 開閉原則是應對需求變更的最基本手段。
寫程序的小感悟
在開發程序的時候必須要考慮到運維的簡單性。
因為越復雜的運維需求,導致越高的事故率,70% 的線上事故是和運維操作有關.
游戲程序優化的基本出發點
游戲程序的基本特點,是對延遲的苛刻要求,以及對數據準確性的不苛刻要求。
軟件系統性能提高的最常用手段有兩個,其一是緩存,其二是分布。
緩存就是時空轉換,以時間、空間中富裕的一種去彌補緊缺的另外一種; 分布就是增加多個硬件一起解決問題,核心是如何分配以及最后結合這些工作任務。
設計模式,是利用面向對象的語言特性,去解決一系列常見問題的典型方法。
數據結構加算法等于程序,這個描述現在來看并不完整。需要被程序處理的數據,同樣是一個程序的重要組成部分。數據流中的輸入和輸出永遠是至關重要的。







