精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

設(shè)計(jì)一個簡單的iOS架構(gòu)

移動開發(fā)
正如“100個讀者就有100個哈姆雷特”一樣,對于架構(gòu)的理解不同的軟件工程師有不同的看法。架構(gòu)設(shè)計(jì)往往是一個權(quán)衡的過程,每一個架構(gòu)設(shè)計(jì)者都要考慮到各個因素,比如團(tuán)隊(duì)成員的技術(shù)水平、具體的業(yè)務(wù)場景、項(xiàng)目的成長階段和開發(fā)周期。

前言

正如“100個讀者就有100個哈姆雷特”一樣,對于架構(gòu)的理解不同的軟件工程師有不同的看法。架構(gòu)設(shè)計(jì)往往是一個權(quán)衡的過程,每一個架構(gòu)設(shè)計(jì)者都要考慮到各個因素,比如團(tuán)隊(duì)成員的技術(shù)水平、具體的業(yè)務(wù)場景、項(xiàng)目的成長階段和開發(fā)周期。

本文談?wù)劰P者的一些架構(gòu)理念,以及本人是如何設(shè)計(jì)一個簡單的 iOS 架構(gòu)。

iOS 架構(gòu) DEMO

一、關(guān)于組件化

組件化似乎是項(xiàng)目發(fā)展壯大過后必然要做的事情,它能讓各個業(yè)務(wù)線的工程師不需要過多的關(guān)注其他業(yè)務(wù)線的代碼,有效的提高團(tuán)隊(duì)整體效率。然而實(shí)施組件化的時機(jī)是在需求相對穩(wěn)定、產(chǎn)品閉環(huán)形成過后。所以本文不會應(yīng)用組件化,但是這里簡單談?wù)剺I(yè)界的組件化方案。

組件化的核心問題就是組件間如何通訊。“軟件工程的一切問題都能通過一個間接的中間層解決。”中介模式很自然的運(yùn)用起來:

設(shè)計(jì)一個簡單的iOS架構(gòu)

這樣雖然能統(tǒng)一組件間的通訊請求,但是卻沒有避免 Mediator 和目標(biāo)組件的耦合,ModuleA 工程中仍然需要導(dǎo)入 ModuleB 。

所以重點(diǎn)問題落在了解耦上: 

設(shè)計(jì)一個簡單的iOS架構(gòu)

要達(dá)到 Mediator 和目標(biāo)組件的解耦,就需要實(shí)現(xiàn)它們之間的間接調(diào)用(圖中虛線),既然是間接調(diào)用,必然需要一種映射機(jī)制。在 iOS 開發(fā)中,業(yè)界大概有三種方式來處理。

(1) 使用 URL -> Block 解耦

簡單來說就是將組件的調(diào)用代碼放入 block 中,然后 URL 作為 key,block 作為 value,存入一個全局的 hash 容器,組件通過一個 URL (比如 "native/id=10/type=1" )向 Mediator 發(fā)起請求,Mediator 找到對應(yīng)的代碼塊執(zhí)行。由此,解開了 Mediator 和目標(biāo)組件的耦合(見博客:蘑菇街 App 的組件化之路)。

這種方案的缺陷很多:組件越多常駐內(nèi)存越多;解析 URL 邏輯復(fù)雜;URL 無法表述具體語言相關(guān)的對象類型。所以這種方式并不適合組件化解耦。

(2) 使用 Protocol 解耦

阿里的 BeeHive 是該方案的很好實(shí)踐,筆者閱讀了一下源碼,它的大致工作原理如下:注冊 Protocol 對應(yīng)的組件,這個和上面說的 URL->Block 方式如出一轍,只不過這里是 Protocol-> Module ;組件申請?jiān)L問時導(dǎo)入對應(yīng)的 Protocol 通過 Mediator 獲取到對應(yīng)的組件對象。由于協(xié)議的表述能支持所有的對象類型,所以這種方式能基本解決組件間通信的需求。

BeeHive 注冊組件有幾種方式,一種是監(jiān)聽了動態(tài)鏈接時 image 二進(jìn)制文件加載完成的回調(diào),通過修改代碼段的方式判斷對應(yīng)的模塊進(jìn)行注冊;第二種是在 +load 方法里面注冊;第三種是異步注冊,但是這種方式存在一個問題,可能組件使用方準(zhǔn)備使用組件的時候,這個組件還未注冊成功。

BeeHive 還為組件設(shè)置了優(yōu)先級的概念,它通過數(shù)組來保持優(yōu)先級排序,在源碼中能看到一些數(shù)組排序的邏輯,這就帶來了相當(dāng)多的高時間復(fù)雜度的運(yùn)算。

所以,組件數(shù)量過多的話,會延長動態(tài)鏈接庫的過程。

BeeHive 為了讓每一個組件享有獨(dú)自的 app 生命周期、3D touch 等功能,會將這些系統(tǒng)級的事件發(fā)送給每一個組件,且不談大量的方法調(diào)用損耗,它必須讓入口文件 AppDelegate 繼承自 BeeHive 的 BHAppDelegate,筆者感覺侵入性過強(qiáng),并且當(dāng)開發(fā)者需要復(fù)寫 AppDelegate 方法的時候,還要注意讓super調(diào)用一下,可以說很不優(yōu)雅了。

在基于協(xié)議的組件化方案中,組件使用方能直接拿到目標(biāo)組件的實(shí)例,那么使用者可能對該實(shí)例進(jìn)行修改,這可能會帶來安全問題。

(3) 使用 Target-Action 解耦

Casa Taloyum 前輩的 iOS應(yīng)用架構(gòu)談 組件化方案 為此做出了***實(shí)踐。

Mediator 使用 Target-Action 來間接的調(diào)用目標(biāo)組件,無需專門注冊。組件維護(hù)者需要做一個 Mediator 的分類,通過硬編碼調(diào)用目標(biāo)組件,然后組件使用者只需要依賴這個分類就行了。

封裝的 Mediator 源碼只有簡單的 200+ 行代碼,并且很易懂。這也讓開發(fā)者能對組件化的實(shí)施更加有信心,不會因?yàn)榛A(chǔ)設(shè)施的錯誤而束手無策。

小總結(jié)

關(guān)于以上組件化的簡單表述僅代表筆者的個人見解,由于筆者并沒有真正的實(shí)施組件化,所以理解可能有誤。

雖然筆者設(shè)計(jì)的 iOS 架構(gòu)不會應(yīng)用組件化,但是這給我們的架構(gòu)設(shè)計(jì)帶來了前瞻性的引導(dǎo),這非常重要。

二、模塊化思維劃分文件

在團(tuán)隊(duì)開發(fā)中,項(xiàng)目發(fā)展到后期總是會出現(xiàn)某些文件或代碼難以管理,出現(xiàn)這種情況的主要原因通常是項(xiàng)目開發(fā)過程中對文件的管理過于隨意。

開發(fā)者應(yīng)該盡量將所有代碼文件歸于模塊,而不要出現(xiàn)模擬兩可的文件。而筆者這里說的模塊,是有具體意義的模塊,比如圖片處理模塊、字體處理模塊,而不是諸如 Public、Common 等無具體意義的代碼文件。

試想,在多人開發(fā)中,當(dāng)所有人都覺得有些代碼不知道怎么歸類的時候,就會往 Public 里面扔。當(dāng)你某天想要整理一下這個 Public,會發(fā)現(xiàn)已經(jīng)無從下手;或者當(dāng)你需要遷移項(xiàng)目中的某個業(yè)務(wù)模塊時,會附帶遷移一些模塊,當(dāng)這個模塊是有意義的(比如圖片處理模塊),你的遷移成本會非常低,但是當(dāng)這個藕斷絲連的模塊是 Public 時,時間成本可能高于你的想象,估計(jì)你會將它完整的拷貝過去,而又對新項(xiàng)目造成了污染。

全局的公共文件是產(chǎn)生垃圾代碼的源頭。筆者認(rèn)為幾乎所有的代碼都是可以歸類為模塊的。

大致梳理了一個文件分類,當(dāng)然這個分類是靈活的,只是要分模塊劃分:

  • - GeneralModules 放項(xiàng)目獨(dú)有的通用配置模塊(比如通用顏色模塊、通用字體模塊)
  • - ToolModules 放工具類模塊(比如系統(tǒng)信息模塊)
  • - PackageModules 放基于業(yè)務(wù)的一些封裝(比如提示框模塊、加載菊花模塊)
  • - BusinessModules 放業(yè)務(wù)模塊(比如購物車、個人中心)

具體里面放了些什么,可以查看筆者的 DEMO。

三、減少全局宏的使用

很多時候,過多的宏讓項(xiàng)目很不整潔,每一個開發(fā)者都往全局文件添加宏,而往往只是一段簡單的代碼,筆者認(rèn)為開發(fā)中應(yīng)該盡量少使用宏,原因如下:

  • 宏在預(yù)編譯階段替換為實(shí)際代碼,存在效率問題
  • 使用宏的地方可能只需要一塊內(nèi)存,但是宏替換過后開辟了多個(這種情況應(yīng)該用常量替換宏)
  • 可能存在潛在的宏命名沖突
  • 宏包裝過多的代碼難以理解和調(diào)試
  • 代碼遷移時需要處理全局的宏

實(shí)際上,非得使用宏的地方并非那么多,比如需要定義一個全局的導(dǎo)航欄字體方便使用,可以將通用字體的配置參數(shù)作為一個模塊: 

  1. @interface YBGeneralFont : NSObject 
  2. /** 導(dǎo)航欄標(biāo)題字體 */ 
  3. + (UIFont *)navigationBarTitleFont; 
  4. @end 

或者用常量來代替宏: 

  1. .h 
  2. FOUNDATION_EXTERN NSString * const kNotify_xxx; //xxx通知 key 
  3. .m 
  4. NSString * const kNotify_xxx = @"kNotify_xxx"

這么做也便于轉(zhuǎn)換思維,畢竟 swift 中是沒有宏的。

四、去基類化設(shè)計(jì)

代碼設(shè)計(jì)中,應(yīng)該盡量避免基類的使用,也就是說,你不應(yīng)該總是要求開發(fā)者去繼承你的基類來做功能。使用基類將造成不可避免的耦合,為業(yè)務(wù)的長期發(fā)展帶來阻礙(當(dāng)然某些情況是可以使用基類的)。

其實(shí)使用基類就算了,若是將大量的業(yè)務(wù)邏輯放入基類中將是災(zāi)難的開端。試想,當(dāng)項(xiàng)目新成員一來就看見成千上萬行的基類代碼TA作何感想?

另外一種場景,當(dāng)需要將項(xiàng)目中的某個模塊遷移到其他項(xiàng)目,或者需要將其他項(xiàng)目合并入當(dāng)前項(xiàng)目,基類的合并將是一個非常頭疼的問題,它藕斷絲連的模塊和代碼會讓你抓狂。

那么,類的工具方法應(yīng)該放哪兒?對所有類的統(tǒng)一配置應(yīng)該放哪兒?對封裝模塊的個性化定制應(yīng)該怎么做?

裝飾模式

類的工具方法,按道理說可以提取為模塊,但是有些場景可能顯得不夠簡潔。

其實(shí)只要留意 iOS 官方的 API,你就不難發(fā)現(xiàn)裝飾模式的大量應(yīng)用,使用數(shù)個分類將大量的方法按照功能分類,會清晰且優(yōu)雅: 

  1. @interface UIViewController (YBGeneral) 
  2. /** 基礎(chǔ)配置 */ 
  3. - (void)YBGeneral_baseConfig; 
  4. @end 
  5. @interface UIViewController (YBGeneralBackItem) 
  6. /** 配置通用系統(tǒng)導(dǎo)航欄返回按鈕 */ 
  7. - (void)YBGeneral_configBackItem; 
  8. /** 重寫該方法以自定義系統(tǒng)導(dǎo)航欄返回按鈕點(diǎn)擊事件 */ 
  9. - (void)YBGeneral_clickBackItem:(UIBarButtonItem *)item; 
  10. @end 

不過要注意的時,定義分類的時候一定要加一個前綴標(biāo)識以避免方法覆蓋。

AOP

面向切面編程在 iOS 領(lǐng)域經(jīng)典的應(yīng)用就是利用 Runtime 去 Hook 方法: 

  1. @implementation UIViewController (YBGeneralHook) 
  2. + (void)load { 
  3.     [self YBGeneralHook_exchangeImplementationsWithOriginSel:@selector(viewDidLoad) customSel:@selector(YBGeneralHook_viewDidLoad)]; 
  4. + (void)YBGeneralHook_exchangeImplementationsWithOriginSel:(SEL)originSel customSel:(SEL)customSel { 
  5.     Method origin = class_getInstanceMethod(self, originSel); 
  6.     Method custom = class_getInstanceMethod(self, customSel); 
  7.     if (origin && custom) { 
  8.         method_exchangeImplementations(origin, custom); 
  9.     } 
  10. - (void)YBGeneralHook_viewDidLoad { 
  11.     NSLog(@"進(jìn)入:%@", self); 
  12.     [self YBGeneral_baseConfig]; 
  13.     if (self.navigationController && [self.navigationController.viewControllers indexOfObject:self] != 0) { 
  14.         [self YBGeneral_configBackItem]; 
  15.     } 
  16.     [self YBGeneralHook_viewDidLoad]; 
  17. @end 

代碼中統(tǒng)一配置了 UIViewController 的系統(tǒng)導(dǎo)航欄返回按鈕,注意這里調(diào)用的業(yè)務(wù)配置方法都是定義在 UIViewController 的分類里面的。若有某些導(dǎo)航欄需要格外配置返回按鈕的需求,可以拓展一個屬性來控制。

面向協(xié)議設(shè)計(jì)模式

對于一些封裝的組件,多考慮使用協(xié)議來個性化定制,繼承作為最差方案,而非是***方案。

定義一個遵守組件定制協(xié)議的屬性是常用的解決方法:

  1. @property (nonatomic, strong) id<someProtocol>  strategy; 

不同的屬性作為不同的策略,組件內(nèi)部通過調(diào)用對應(yīng)的協(xié)議方法實(shí)現(xiàn)個性化定制。而當(dāng)使用者想要改變策略時,只需要更改這個屬性就行了。面向協(xié)議設(shè)計(jì)模式結(jié)合策略模式是一個很好的實(shí)踐。

五、MVC?MVP?MVVM?VIPER?

業(yè)務(wù)具體的架構(gòu)模式是個讓很多開發(fā)者頭疼的問題,因?yàn)橛袝r候能讓復(fù)雜業(yè)務(wù)更清晰,有時候卻因?yàn)槟z水代碼過多而臃腫。

實(shí)際上為什么要嚴(yán)格的遵守架構(gòu)模式呢?為什么每一個業(yè)務(wù)模塊的架構(gòu)模式都要一模一樣呢?

筆者認(rèn)為正確的架構(gòu)思路一定是根據(jù)業(yè)務(wù)來的,不同的模塊,不同的業(yè)務(wù)線完全可以有不同的架構(gòu),只需要架構(gòu)足夠清晰不至于晦澀。

大致設(shè)計(jì)了一下架構(gòu)的主旋律:

設(shè)計(jì)一個簡單的iOS架構(gòu)

  • DataCenter 負(fù)責(zé)數(shù)據(jù)的獲取、處理、緩存等。
  • Model 設(shè)計(jì)為“瘦” Model,便于復(fù)用和遷移;也考慮到數(shù)據(jù)源可能數(shù)量龐大,若 Model 設(shè)計(jì)得過于“胖”,會造成更多的內(nèi)存占用。
  • View 負(fù)責(zé)數(shù)據(jù)的展示,可以根據(jù)業(yè)務(wù)情況權(quán)衡是否需要 ViewModel 處理界面邏輯。
  • ViewController 作為 DataCenter 和 View 的橋梁。

筆者設(shè)計(jì)的項(xiàng)目目前不會很復(fù)雜,多數(shù)情況上面的架構(gòu)就已經(jīng)夠用,若某個頁面功能過多,完全可以提取一些額外的模塊,比如 DataCenter 處理過于復(fù)雜,那就把數(shù)據(jù)的處理和緩存提取出來:xxxDataProcesser、xxxDataCache。這些都是靈活的,只需要按照模塊化的思維提取,ViewController 的代碼相信也不會太多。

關(guān)于響應(yīng)式框架

Reactivecocoa 雖然強(qiáng)大,筆者以前也用過,不過它是一個重量級框架,學(xué)習(xí)成本有點(diǎn)高,可能會因?yàn)閳F(tuán)隊(duì)成員對其了解不足導(dǎo)致難以定位的錯誤。

而美團(tuán)的 EasyReact 似乎是一個福音,筆者大概瀏覽了一下源碼,質(zhì)量確實(shí)很高,對性能方面的處理很精致,基于圖論算法的處理也感覺很棒,項(xiàng)目侵入性也很小。不過缺點(diǎn)就是太新了,需要開發(fā)社區(qū)一定時間的驗(yàn)證,暫時筆者持觀望態(tài)度。

結(jié)語

本文只是作者思考過后對一個項(xiàng)目架構(gòu)的簡單設(shè)計(jì),還有很多部分需要完善和補(bǔ)充,具體細(xì)節(jié)也可能會按照具體情況修改。Demo 只是一個雛形,希望和各位讀者朋友能有所交流。

 

責(zé)任編輯:未麗燕 來源: 簡書
相關(guān)推薦

2024-04-24 10:38:22

2025-05-27 10:15:00

Go開發(fā)軟件架構(gòu)

2019-06-27 09:50:49

高性能秒殺系統(tǒng)

2012-02-01 14:12:55

iOS本地緩存機(jī)制

2020-11-11 09:49:12

計(jì)算架構(gòu)

2021-05-20 13:22:31

架構(gòu)運(yùn)維技術(shù)

2011-03-24 09:34:41

SPRING

2022-11-08 08:35:53

架構(gòu)微服務(wù)移動

2009-08-19 04:14:00

線性鏈表

2023-02-07 10:40:30

gRPC系統(tǒng)Mac

2009-07-14 16:02:42

JDBC例子

2020-11-09 06:38:00

ninja構(gòu)建方式構(gòu)建系統(tǒng)

2023-01-03 12:30:25

架構(gòu)CPUGPU

2021-04-28 08:52:22

高并發(fā)架構(gòu)設(shè)高并發(fā)系統(tǒng)

2025-10-28 02:00:00

秒殺系統(tǒng)客戶端并發(fā)

2025-01-22 08:00:00

架構(gòu)秒殺系統(tǒng)Java

2013-03-26 14:17:21

架構(gòu)架構(gòu)設(shè)計(jì)事件驅(qū)動

2011-09-08 13:41:53

Widget

2016-09-21 12:54:10

CAAS系統(tǒng)鏡像

2017-08-17 16:37:59

MySQL數(shù)據(jù)遷移
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

青春有你2免费观看完整版在线播放高清| 亚洲视频一区在线观看| 欧美日韩在线影院| 久久精品国产电影| 国产免费成人在线| 欧美日韩成人免费观看| 国产成人精品123区免费视频| 国产精品一区在线观看乱码 | 亚洲视频在线观看视频| 国产精品xxxx| 午夜三级在线观看| 日韩成人高清| 亚洲综合色噜噜狠狠| 91情侣偷在线精品国产| a级黄色免费视频| 小视频免费在线观看| www.亚洲在线| 97精品免费视频| 国产日韩视频一区| 蜜臀av在线播放| 福利一区二区在线| 欧美激情一级二级| 精品无码av一区二区三区| 制服丝袜在线播放| 国产成人午夜精品5599| 欧美激情精品久久久久久蜜臀 | 大美女一区二区三区| 精品久久久999| 亚洲人成人无码网www国产| 中文在线免费二区三区| 亚洲黄色性网站| http;//www.99re视频| 久久精品第一页| 欧美激情偷拍自拍| 日韩三级电影网址| 日本精品久久久久久久久久| 天堂av一区二区三区| 一区二区久久| 亚洲免费看av| 欧美日韩在线视频免费播放| 57pao成人永久免费| 日本网站在线免费观看视频| 国产色噜噜噜91在线精品| 亚洲久本草在线中文字幕| 91在线在线观看| 国产午夜精品无码| 六月丁香久久丫| 日韩欧美在线免费| 电影一区二区| 欧美一级网站| 亚洲欧美三级伦理| 熟妇人妻无乱码中文字幕真矢织江| 午夜性色福利视频| 日韩电影免费在线看| 一区二区福利视频| 亚洲国产欧美91| 欧美gv在线| 国产精品人妖ts系列视频| 成人黄色中文字幕| 久久午夜无码鲁丝片| 亚洲影院天堂中文av色| 欧美精品在线观看播放| 青青草国产精品视频| 国产精品视频一区二区久久| 国产精品一区免费在线观看| 91精品在线影院| 97人妻人人澡人人爽人人精品| 国产麻豆一精品一男同| 国产一区二区三区四区二区| 欧美区在线观看| cao在线观看| shkd中文字幕久久在线观看| 97人人在线视频| 成人免费视频caoporn| 亚洲永久在线观看| 精品久久免费看| 免费一级特黄特色毛片久久看| av软件在线观看| 亚洲国产美国国产综合一区二区| 欧洲精品亚洲精品| 精品人妻一区二区三区四区不卡| 久久在线精品| 久久久久久噜噜噜久久久精品| 久久久久亚洲天堂| 久久福利影视| 97久久精品国产| 久久中文字幕免费| 在线精品福利| 美女性感视频久久久| 亚洲精品一区二区三区影院忠贞| 久久香蕉精品香蕉| 亚洲欧美日韩国产成人| 99久久精品久久亚洲精品| 免费观看久久av| 亚洲国产另类 国产精品国产免费| 婷婷中文字幕在线观看| 日本成人福利| 日韩手机在线导航| 魔女鞋交玉足榨精调教| 精品福利一区| 中文字幕日本精品| 欧美一区二区三区粗大| 国产精品一区二区av交换| 免费成人美女女| 久久这里只有精品6| 国产精品一码二码三码在线| 国产激情视频在线播放| 精品一区中文字幕| 国产主播喷水一区二区| 在线黄色av网站| 蜜臀av一区二区在线观看| 国产精品444| 成人av网站在线播放| 另类av一区二区| 99久久精品免费看国产一区二区三区| 青青青草原在线| 一区二区三区四区国产精品| 另类小说第一页| 69堂精品视频在线播放| 狠狠久久五月精品中文字幕| 男人添女人下面高潮视频| 福利成人导航| 欧美日韩一区二区在线播放| 特级黄色片视频| 国产精品视频一区二区三区四蜜臂| 久久99久久99精品免观看粉嫩| 欧美精品一区二区蜜桃| 免费一级欧美片在线观看| 九九九九九九精品| 国产h在线观看| 精品久久久视频| wwwwxxxx日韩| 妖精视频一区二区三区| 午夜精品理论片| 亚洲av综合色区无码一区爱av| gogogo免费视频观看亚洲一| 激情图片qvod| 国产极品在线观看| 在线亚洲人成电影网站色www| 亚洲精品视频导航| 台湾色综合娱乐中文网| 尤物九九久久国产精品的特点 | 亚洲午夜在线视频| 国产91国语对白在线| 精品成人18| 日韩女优av电影| 蜜臀av粉嫩av懂色av| 911久久香蕉国产线看观看| 久久久久久久国产精品视频| 99久久亚洲精品日本无码| 国产精品白丝在线| 人人妻人人澡人人爽欧美一区双| 图片一区二区| 日韩久久免费电影| 午夜av一区| 日本韩国一区二区三区| 午夜国产一区二区三区| 夜色77av精品影院| 日本午夜在线亚洲.国产| 殴美一级黄色片| 中文字幕一区二区精品区| www.久久撸.com| 中文字幕亚洲欧美日韩| 黄网在线观看视频| 婷婷激情久久| 91chinesevideo永久地址| 最新中文字幕在线观看视频| 亚洲av无码乱码国产精品久久| 国产精品视频观看| 国产日产久久高清欧美一区| 国产精品沙发午睡系列| 在线高清av| 精品五月天久久| 中文字幕日韩免费| 中文字幕一区二区三中文字幕| 亚洲综合伊人久久| 亚洲片区在线| 国产综合久久久久久| 动漫一区在线| 色欧美片视频在线观看在线视频| 日韩欧美黄色网址| 国产麻豆欧美日韩一区| 日本午夜激情视频| 日本午夜一区| 欧美大胆a视频| 女人18毛片水真多18精品| 亚洲男帅同性gay1069| 在线免费看v片| 国产偷自视频区视频一区二区| 成人久久18免费网站图片| 午夜在线激情影院| 51精品国自产在线| 精品国产成人亚洲午夜福利| 麻豆精品一区二区三区| 欧美系列一区| 性xxxxfreexxxxx欧美丶| 中文字幕精品在线视频| 亚洲黄色在线观看视频| 91久久一区二区| 欧美精品色哟哟| 欧美激情一区在线| 成人在线看视频| 欧美一级二级三级视频| 欧美激情第三页| 成人激情电影在线看| 欧美videofree性高清杂交| 久久久久亚洲视频| 一区二区免费不卡在线| 中文字幕视频一区| 99色这里只有精品| 成人久久电影| 精品国产一区二区三区麻豆免费观看完整版 | 中国女人真人一级毛片| 国产午夜精品久久久久久免费视| 国产超级av在线| 欧美在线影院| 国产高清在线一区二区| 91另类视频| 91av免费观看91av精品在线| 国产激情在线| 色偷偷88888欧美精品久久久| 亚洲图片小说视频| 日韩欧美在线视频观看| 激情开心成人网| 色综合中文字幕| 亚洲一区二区蜜桃| 精品99视频| 91九色国产ts另类人妖| 日韩免费成人av| 91女神在线视频| 国产99久久九九精品无码| frxxee中国xxx麻豆hd| 日韩欧美网址| av美女在线观看| 亚洲精品国产suv| 性欧美videos另类hd| 制服视频三区第一页精品| 精产国品一区二区| 日韩人体视频一二区| 免费黄色网址在线| 精品免费在线视频| 日韩av综合在线| 国产精品小仙女| 午夜一区二区视频| 狠狠噜噜久久| 欧美亚洲国产免费| 五月国产精品| 蜜桃成人在线| 亚洲欧美在线综合| 国产精品一区二区三区免费视频 | 美女av一区二区三区| 免费a级在线播放| 日韩亚洲欧美一区| av男人天堂av| 欧美v日韩v国产v| 亚洲精品一区二区三区蜜桃| 精品日本一线二线三线不卡| 成人午夜精品福利免费| 色av成人天堂桃色av| 手机在线看片1024| 欧美午夜电影一区| 国产精品久在线观看| 国产一级在线| 欧美成人高清电影在线| 男女无套免费视频网站动漫| 乡村艳史在线观看| 日韩av男人的天堂| 亚洲电影有码| 99久久99久久精品免费看蜜桃| 人妻熟人中文字幕一区二区| 欧美jizz18| 中日韩午夜理伦电影免费| 阿v免费在线观看| www.欧美精品| 三级av免费观看| 亚洲免费福利一区| 清纯唯美一区二区三区| 欧美独立站高清久久| 国产成人生活片| 日韩免费看片| 精品国产一区二区三区在线| 亚洲美女少妇无套啪啪呻吟| 狠狠操精品视频| 国产一区美女在线| 日韩av片网站| 国产一区二区三区在线观看免费视频 | 男人添女人荫蒂国产| 老司机精品福利视频| 91国内在线播放| 99精品欧美一区二区三区小说| 波多野结衣一二三四区| 亚洲综合免费观看高清在线观看| 欧美一级特黄视频| 欧美放荡的少妇| 日本一区高清| 欧美噜噜久久久xxx| 亚洲精品一级二级| 国产精品一区二区久久| 亚洲2区在线| 久久男人av资源网站| 中文av资源在线| 青草青草久热精品视频在线网站 | 超碰影院在线观看| 色视频在线观看| 久久久国产一区二区| 竹内纱里奈兽皇系列在线观看| 91免费观看网站| 男人用嘴添女人下身免费视频| 在线视频精品| 色婷婷一区二区三区在线观看| 91美女福利视频| 久久久久久久极品内射| 欧美日韩免费高清一区色橹橹 | 中文字幕观看在线| 亚洲国产精品人久久电影| www.久久久久.com| 国产精品嫩草视频| 美女毛片一区二区三区四区最新中文字幕亚洲| 日本女人高潮视频| 美美哒免费高清在线观看视频一区二区| 亚洲熟女乱综合一区二区三区| 国产裸体歌舞团一区二区| 中文字幕国产专区| 国产精品无人区| 三级黄色录像视频| 色综合久久综合网| 特黄视频在线观看| 欧美日韩xxx| 国产剧情一区二区在线观看| 国产66精品久久久久999小说| 成人羞羞动漫| 北条麻妃视频在线| 久久久久久久综合| 一区二区三区影视| 精品久久久久久久久久国产| 国产成人精品一区二区无码呦| 日韩中文在线不卡| 欧美成人高清视频在线观看| 欧美精品一区二区视频| 国产精品美女| 色噜噜在线观看| 国产精品理论片在线观看| 成人公开免费视频| 亚洲日韩中文字幕| 天然素人一区二区视频| 茄子视频成人在线观看 | 亚洲午夜影视影院在线观看| 国产成人精品免费看视频| 欧美成人激情视频免费观看| 欧美日韩五区| 欧美中文在线免费| 国产图片一区| 69sex久久精品国产麻豆| 国产福利视频一区二区三区| 久久高清内射无套| 日本高清黄色片| 亚洲日本青草视频在线怡红院| 涩涩视频在线观看| 中文字幕日韩欧美精品在线观看| 日本中文字幕一区二区| 少妇特黄a一区二区三区| 亚洲v天堂v手机在线| 国产精品一区二区免费在线观看| 成人中文字幕av| 国产日本精品| 亚洲av无码一区二区二三区| 色综合一个色综合亚洲| 九色在线播放| 国产欧美精品在线播放| 亚洲国产精品日韩专区av有中文| 国产伦精品一区二区三区妓女下载| 国产成人av一区二区三区在线观看| 九九在线观看视频| 亚洲国产精品yw在线观看| 午夜在线小视频| 91免费福利视频| 亚洲电影在线| 亚洲一区二区三区日韩| 8x8x8国产精品| 91福利在线免费| 神马影院我不卡午夜| 国产剧情一区在线| 欧美三级午夜理伦| 日韩资源在线观看| 成人av激情人伦小说| 中文字幕一区二区三区乱码| 久久欧美肥婆一二区| 亚洲女同中文字幕| 九九九九九精品| 青青青伊人色综合久久| 日韩 欧美 高清| 国产精品亲子伦对白| 精品人妻无码一区二区| 日本精品久久电影| 忘忧草精品久久久久久久高清| 国产综合内射日韩久| 欧美视频一区二区三区四区| 国产精品探花在线| 亚洲欧美日韩国产yyy| 日韩影院免费视频|