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

Swift面向協議編程(POP)的一些Tips

移動開發
協議最常見的用法莫過于進行代理傳值,這就是委托模式。常用的應用場景有:controller中自定義了一個view,view中又添加了一個自定義view。在自定義的view中如果有些函數或者屬性需要到controller中去調用,委托模式的做法就是規定一個協議,讓controller去遵守一個協議并提供實現。

一、委托模式

1、使用過程

協議最常見的用法莫過于進行代理傳值,這就是委托模式。常用的應用場景有:controller中自定義了一個view,view中又添加了一個自定義view。在自定義的view中如果有些函數或者屬性需要到controller中去調用,委托模式的做法就是規定一個協議,讓controller去遵守一個協議并提供實現,那么在自定義view中就能使用協議中的方法。

Swift面向協議編程(POP)的一些Tips

舉個例子,現在想在一個controller中添加一個自定義view,可以實現點擊view中按鈕更改controller中label的值。簡單的代碼如下:

自定義view 

  1. //SelectTabbar.swift 
  2. @objc protocol SelectTabbarDelegate { 
  3.     func changeLabel(_ str: String) 
  4.  
  1. //SelectTabbar.swift 
  2.  class SelectTabbar: UIView { 
  3.     var keywords : [String]? 
  4.     var buttons : [UIButton]? 
  5.     weak public var delegate : SelectTabbarDelegate? 
  6.       
  7.     init(frame: CGRect,keywords:[String]) { 
  8.         super.init(frame: frame) 
  9.         self.keywords = keywords 
  10.         renderView() 
  11.     } 
  12.       
  13.     required init?(coder aDecoder: NSCoder) { 
  14.         fatalError("init(coder:) has not been implemented"
  15.     } 
  16.       
  17.     override func layoutSubviews() { 
  18.         super.layoutSubviews() 
  19.     } 
  20.       
  21.     private func renderView(){ 
  22.         buttons = keywords?.enumerated().map({ (index,key) ->UIButton in 
  23.             let buttonWidth = kScreenWidth/CGFloat((keywords?.count)!) 
  24.             let button = UIButton.init(frame: CGRect.init(x: CGFloat(index)*buttonWidth, y: 0, width: buttonWidth, height: 50)) 
  25.             button.setTitle(keyfor: .normal) 
  26.             button.setTitleColor(UIColor.blue, for: .normal) 
  27.             button.backgroundColor = UIColor.gray 
  28.             button.tag = index 
  29.             button.addTarget(self, action: #selector(tapButton(sender:)), for: .touchUpInside) 
  30.             addSubview(button) 
  31.             return button 
  32.         }) 
  33.     } 
  34.       
  35.     @objc func tapButton(sender: UIButton){ 
  36.         delegate?.changeLabel(keywords![sender.tag]) 
  37.     } 
  38.       

controller: 

  1. class TestViewController: UIViewController,SelectTabbarDelegate { 
  2.     lazy var label : UILabel = { 
  3.         var label = UILabel(frame: CGRect.init(x: 50, y: 200, width: 100, height: 30)) 
  4.         label.text = labelStr 
  5.         label.backgroundColor = UIColor.red 
  6.         return label 
  7.     }() 
  8.       
  9.     private var labelStr : String? { 
  10.         didSet{ 
  11.             label.text = labelStr 
  12.         } 
  13.     } 
  14.       
  15.     override func viewDidLoad() { 
  16.         super.viewDidLoad() 
  17.         view.backgroundColor = .white 
  18.         view.addSubview(label) 
  19.         setupSelectTabbar() 
  20.     } 
  21.       
  22.     func setupSelectTabbar(){ 
  23.         let selectTabbar = SelectTabbar(frame: CGRect.init(x: 0, y: kNavigationHeightAndStatuBarHeight, width: kScreenWidth, height: 50),keywords:["aa","bb"]) 
  24.         selectTabbar.delegate = self 
  25.         view.addSubview(selectTabbar) 
  26.     } 
  27.     func changeLabel(_ str: String) { 
  28.         labelStr = str 
  29.     } 
  30.       

這樣就能比較清楚的表明自己的邏輯。否則,如果要在view操作controller的內容,則需要在外部操作controller的實例,這就造成一個問題,就是無法操作實例中的私有屬性和私有方法(雖然iOS是一門動態語言,不存在絕對的私有,但是誰會去一直去使用runtime來進行操作呢)。

2、注意點

在 ARC 中,對于一般的 delegate,我們會在聲明中將其指定為 weak,在這個 delegate 實際的對象被釋放的時候,會被重置回 nil。這可以保證即使 delegate 已經不存在時,我們也不會由于訪問到已被回收的內存而導致崩潰。ARC 的這個特性杜絕了 Cocoa 開發中一種非常常見的崩潰錯誤,說是救萬千程序員于水火之中也毫不為過。

在 Swift 中我們當然也會希望這么做。但是當我們嘗試書寫這樣的代碼的時候,編譯器不會讓我們通過:

  1. 'weak' cannot be applied to non-class type 

原因:這是因為 Swift 的 protocol 是可以被除了 class 以外的其他類型遵守的,而對于像 struct 或是 enum 這樣的類型,本身就不通過引用計數來管理內存,所以也不可能用 weak 這樣的 ARC 的概念來進行修飾。

兩種解決方法:

  1. 使用@objc
  2. 聲明類類型專屬協議。通過添加 class 關鍵字來限制協議只能被類類型遵循,而結構體或枚舉不能遵循該協議。class 關鍵字必須***個出現在協議的繼承列表中,在其他繼承的協議之前
  • protocol SelectTabbarDelegate : class

二、AOP編程思想的運用

首先我們理解下AOP的含義。

  • In computing, aspect-oriented programming (AOP) is a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns. It does so by adding additional behavior to existing code (an advice) without modifying the code itself, instead separately specifying which code is modified via a “pointcut” specification, such as “log all function calls when the function’s name begins with ‘set’”. This allows behaviors that are not central to the business logic (such as logging) to be added to a program without cluttering the code, core to the functionality. AOP forms a basis for aspect-oriented software development.

在swift簡單來說,就是利用協議去切入某些代碼中,將額外的功能單獨出來而不產生耦合,可以將這些與主邏輯關系不大的代碼統一放到一起。

常用的場景:日志記錄,性能統計,安全控制,事務處理,異常處理等等。

接上面的例子,我們需要在打開TestViewController的時候統計一次,點擊兩個按鈕的時候也進行統計,統計的內容由identifer進行區分。

我們先建立一個Statistician.swift 來存放我們的統計邏輯。(模擬實現)

申明一個StatisticianProtocal協議并提供他的默認實現。 

  1. import Foundation 
  2. enum LogIdentifer:String { 
  3.     case button1 = "button1" 
  4.     case button2 = "button2" 
  5.     case testViewController = "testViewController" 
  6.   
  7. protocol StatisticianProtocal { 
  8.     func statisticianLog(fromClass:AnyObject, identifer:LogIdentifer) 
  9.     func statisticianUpload(fromClass:AnyObject, identifer:LogIdentifer) 
  10.     //用一個尾隨閉包來擴展功能 
  11.     func statisticianExtension(fromClass:AnyObject, identifer:LogIdentifer, extra:()->()) 
  12.   
  13. extension StatisticianProtocal{ 
  14.     func statisticianLog(fromClass:AnyObject, identifer:LogIdentifer) { 
  15.         print("statisticianLog--class:\(fromClass) from:\(identifer.rawValue)"
  16.     } 
  17.       
  18.     func statisticianUpload(fromClass:AnyObject, identifer:LogIdentifer) { 
  19.         print("statisticianUpload--class:\(fromClass) from:\(identifer.rawValue)"
  20.     } 
  21.       
  22.     func statisticianExtension(fromClass:AnyObject, identifer:LogIdentifer, extra:()->()){ 
  23.         extra() 
  24.     } 
  25.   
  26. class Statistician: NSObject { 
  27.   

接下來在任何需要統計的類里面,我們讓這個類去遵守這個協議,然后在需要的地方調用協議中的方法即可。如果在某個特定的類中需要調用的方法略有不同,重寫協議中的方法即可。 

  1. class SelectTabbar: UIView,StatisticianProtocal { 
  2.     var keywords : [String]? 
  3.     var buttons : [UIButton]? 
  4.     weak public var delegate : SelectTabbarDelegate? 
  5.       
  6.     init(frame: CGRect,keywords:[String]) { 
  7.         super.init(frame: frame) 
  8.         self.keywords = keywords 
  9.         renderView() 
  10.         //進行一次統計 
  11.         operateStatistician(identifer: .testViewController) 
  12.     } 
  13.       
  14.     required init?(coder aDecoder: NSCoder) { 
  15.         fatalError("init(coder:) has not been implemented"
  16.     } 
  17.       
  18.       
  19.     override func layoutSubviews() { 
  20.         super.layoutSubviews() 
  21.     } 
  22.       
  23.     private func renderView(){ 
  24.         buttons = keywords?.enumerated().map({ (index,key) ->UIButton in 
  25.             let buttonWidth = kScreenWidth/CGFloat((keywords?.count)!) 
  26.             let button = UIButton.init(frame: CGRect.init(x: CGFloat(index)*buttonWidth, y: 0, width: buttonWidth, height: 50)) 
  27.             button.setTitle(keyfor: .normal) 
  28.             button.setTitleColor(UIColor.blue, for: .normal) 
  29.             button.backgroundColor = UIColor.gray 
  30.             button.tag = index 
  31.             button.addTarget(self, action: #selector(tapButton(sender:)), for: .touchUpInside) 
  32.             addSubview(button) 
  33.             return button 
  34.         }) 
  35.     } 
  36.       
  37.     @objc func tapButton(sender: UIButton){ 
  38.         //進行一次統計 
  39.         switch sender.tag { 
  40.           case 0:operateStatistician(identifer: .button1) 
  41.           default:operateStatistician(identifer: .button2) 
  42.         } 
  43.         delegate?.changeLabel(keywords![sender.tag]) 
  44.     } 
  45.       
  46.     func operateStatistician(identifer:LogIdentifer){ 
  47.         statisticianLog(fromClass: self, identifer: identifer) 
  48.         statisticianUpload(fromClass: self, identifer: identifer) 
  49.         statisticianExtension(fromClass: self, identifer: identifer) { 
  50.             print("extra: in SelectTabbar class"
  51.         } 
  52.     } 
  53.       

以上代碼實現了三處統計的邏輯,而不用把統計的邏輯寫入controller文件中,降低了功能上的耦合度。

三、用來代替extension,增強代碼可讀性

使用擴展,可以很方便的為一些繼承它的子類增添一些函數。這就帶來一個問題,就是所有的子類都擁有了這個方法,但是方法的本身可能不明確,或者是只是想讓少數子類來使用這個方法。這時候可以使用協議來代替extension。 

  1. //定義了一個Shakable協議,遵守這個協議的類即可使用里面的方法,并為該方法提供一個默認的實現 
  2. //where Self:UIView表明了只有uiview的子類可以遵守這個協議 
  3. protocol Shakable { 
  4.     func shakeView() 
  5.   
  6. extension Shakable where Self:UIView{ 
  7.     func shakeView(){ 
  8.         print(Self.self) 
  9.     } 

這時候可以讓某個子類來遵守協議。例如剛才上面的例子。

  1. class SelectTabbar: UIView,Shakable 

如果不在類中重新實現這個方法,則可以實現默認的方法。這個意思表明,SelectTabbar類的子類是遵守Shakable協議的,間接等于SelectTabbar():Shakable?。這樣我們就可以愉快的讓SelectTabbar對象去使用這個方法。(Self關鍵字只能用在協議或者類中,表示當前類,可作為返回值使用)。

一旦不想讓某個子類使用shakeView()方法,很簡單,只要把class SelectTabbar: UIView,Shakable中的Shakable協議干掉即可。

其他實踐:

利用AOP去分離tableview的數據源和事件源的方法,可以單獨處理里面的邏輯,使tableview的代理方法不顯得那么冗余。

總結

關于協議,還有很多種用法。以上是目前比較常用的場景。日后開發中如果發現協議在其他地方中有更好的應該,將會更新本文

 

責任編輯:未麗燕 來源: peipeiblog
相關推薦

2023-10-09 08:14:10

Helm管理應用

2013-07-02 10:18:20

編程編程策略

2013-07-02 09:43:02

編程策略

2010-06-09 17:13:12

IPv6協議路由協議

2021-10-13 07:48:23

Options模式編程

2021-04-09 10:26:43

Python編程技術

2010-08-05 13:54:36

NFS協議

2018-06-08 08:50:35

編程語言并發編程

2011-09-13 09:41:59

Python

2011-08-31 10:54:25

Java性能

2012-04-05 13:24:30

2012-02-16 08:19:03

2016-12-12 15:22:41

編程

2010-09-17 15:41:46

網絡協議分析軟件

2009-11-23 13:44:33

PHP5面向對象

2022-07-30 23:41:53

面向過程面向對象面向協議編程

2015-08-04 08:56:14

swift子類

2015-09-15 10:40:41

Swift2.0MVVM

2020-12-04 09:11:45

Python加密文件爆破字典

2015-03-30 11:21:27

編程編程反思
點贊
收藏

51CTO技術棧公眾號

911福利视频| 蜜桃日韩视频| 久久久久亚洲av无码专区| 精品少妇一区| 欧美色综合久久| 国产高清不卡无码视频| 蜜桃视频在线免费| 国产毛片一区二区| 欧美影院在线播放| 午夜爱爱毛片xxxx视频免费看| 黄色欧美网站| 欧美高清www午色夜在线视频| 免费无码毛片一区二三区| 91九色在线porn| 99久久伊人精品| 亚洲在线免费看| 一级特黄免费视频| 亚洲人体大胆视频| 久久五月情影视| 欧美精品日韩一本| 国产精品一区二区三| 国产一级理论片| 欧美在线观看视频一区| 亚洲国产小视频在线观看| 热久久久久久久久| 欧美日韩女优| 欧美性xxxxx极品| 欧美乱做爰xxxⅹ久久久| 尤物网址在线观看| 久久影院视频免费| 国产伦理一区二区三区| 成人高潮片免费视频| 蜜臀久久久99精品久久久久久| 亚洲97在线观看| 九九视频在线免费观看| 99视频精品全国免费| 亚洲图片欧美午夜| 老司机福利av| 欧美电影完整版在线观看| 日韩欧美一级精品久久| 潘金莲激情呻吟欲求不满视频| 精品国产第一福利网站| 欧美日韩在线一区| 国产视频一视频二| 一个人看的www视频在线免费观看| 一区二区三区高清在线| 日韩精品福利片午夜免费观看| av成人手机在线| 欧美国产乱子伦 | 久久久久亚洲精品国产| 青草影院在线观看| 一本一道久久a久久精品蜜桃| 最近2019年好看中文字幕视频| 国产免费一区二区三区网站免费| 色天下一区二区三区| 亚洲国产美女精品久久久久∴| 美女流白浆视频| 无码国模国产在线观看| 精品日韩一区二区| 污污污www精品国产网站| 超碰一区二区三区| 亚洲精品二三区| 国产成一区二区| 在线观看欧美一区| 国产中文字幕在线| 中文字幕av一区二区三区免费看 | 久久综合影院| 亚洲免费视频一区二区| a级在线免费观看| 日韩欧美中字| 久久福利视频网| 精品少妇爆乳无码av无码专区| 亚洲电影成人| 日本高清久久天堂| 亚洲天堂aaa| 国产精品亚洲综合一区在线观看| 91免费看网站| 色鬼7777久久| 国产精品丝袜91| 9色视频在线观看| 国内激情视频在线观看| 色8久久人人97超碰香蕉987| 日韩av卡一卡二| 66精品视频在线观看| 亚洲美女黄色片| 爱爱视频免费在线观看| 亚洲看片免费| 国产美女91呻吟求| 丰满大乳国产精品| 国产日韩欧美一区二区三区乱码 | 性欧美丰满熟妇xxxx性仙踪林| 狠狠综合久久av一区二区蜜桃| 色悠悠国产精品| 久久久久久免费观看| 久久免费黄色| 91视频免费在线| 裸体xxxx视频在线| 一区二区三区精品视频在线| 少妇人妻互换不带套| 国产欧美日韩电影| 亚洲视频网站在线观看| 国内偷拍精品视频| 久久午夜电影| 99伊人久久| 91ph在线| 欧美日韩在线视频首页| 伊人国产精品视频| 免费不卡中文字幕在线| 欧美成年人视频网站| 在线播放日韩精品| 中日韩精品一区二区三区| 国产大片一区| 日韩男女性生活视频| 国产成人精品白浆久久69| 久久久久久久精| www.av蜜桃| 日本欧美在线| 亚洲欧美日韩网| 伊人365影院| 国产一区二区三区观看| 日本在线视频不卡| 精品三级久久| 日韩欧美综合一区| 成人做爰视频网站| 蜜桃视频一区二区| 欧洲在线视频一区| 天堂√8在线中文| 精品国产一二三| 精品一区在线观看视频| 蜜桃视频在线观看一区二区| 欧美精品一区二区三区久久| 岛国av在线播放| 欧美刺激脚交jootjob| 永久免费看片视频教学| 免费成人在线视频观看| 日韩电影在线播放| 神马电影网我不卡| 亚洲免费av片| 日韩久久中文字幕| 久久午夜电影网| 国产午夜伦鲁鲁| 欧美在线导航| 97精品国产aⅴ7777| 蜜桃视频在线观看www| 亚洲综合丝袜美腿| 91福利视频免费观看| 欧美aⅴ99久久黑人专区| 成人久久一区二区| 性欧美1819sex性高清大胸| 欧美一二三四区在线| 黄色一级片中国| 国产精品夜夜嗨| 国产曰肥老太婆无遮挡| 国产精品xxx在线观看| 韩国美女主播一区| 美国一级片在线免费观看视频| 欧美日韩一区二区免费在线观看 | 国产不卡一区二区视频| 风间由美一区二区av101| 久久不卡国产精品一区二区| 久久精品最新地址| 国产深喉视频一区二区| 亚洲九九爱视频| 精品人妻一区二区免费| 亚洲激情亚洲| 日本精品二区| 国产黄色精品| 久久成人在线视频| 日本成人动漫在线观看| 狠狠操狠狠色综合网| 国产伦理片在线观看| 精品一区二区av| 欧美一级爱爱视频| 美女网站色精品尤物极品姐弟| 欧美一级淫片videoshd| a天堂中文在线88| 日韩一级免费一区| 久久久久久久久影院| 亚洲国产高清在线| 69久久精品无码一区二区| 尤物精品在线| 日本一区二区三区精品视频| 日韩欧乱色一区二区三区在线 | h片视频在线观看| 日韩精品免费在线| 一区二区三区日| 午夜精品免费在线观看| 国产熟女一区二区| 国产电影一区二区三区| 久久久精品在线视频| 亚洲mv大片欧洲mv大片| 久99久视频| 国产视频一区二区在线播放| 91成人国产在线观看| 日本欧美在线视频免费观看| 亚洲大胆人体在线| 一区二区视频免费观看| 亚洲第一福利一区| 国产大屁股喷水视频在线观看| 懂色av噜噜一区二区三区av| 91人人澡人人爽人人精品| 综合久久综合| 日韩精品伦理第一区| 91精品短视频| 国产精品一二区| 在线天堂新版最新版在线8| 久久视频中文字幕| 黄上黄在线观看| 亚洲第一精品夜夜躁人人爽| 亚洲视频在线免费播放| 日韩欧美国产成人| 国产精品成人av久久| 国产精品青草久久| 国产偷国产偷亚洲高清97cao| 国产极品国产极品| 久久婷婷色综合| 蜜臀aⅴ国产精品久久久国产老师| 美女免费视频一区二区| 欧美变态另类刺激| 亚洲夜间福利| 黄色网zhan| 日韩1区2区| 日本成人三级| 免费黄色成人| 国产原创精品| 国产成人aa在线观看网站站| 91在线免费网站| 欧美视频精品| 国产精品九九九| 中文日产幕无线码一区二区| 久久男人资源视频| 欧美v亚洲v| 欧美乱大交xxxxx另类电影| 免费黄色网页在线观看| 一区二区欧美亚洲| 福利视频在线看| 一区二区在线视频| 国产精品无码2021在线观看| 亚洲欧美日韩成人| 国产资源在线看| 亚洲欧美一区二区三区四区| 五十路在线视频| 日韩精品中文字幕在线观看| 天天舔天天干天天操| 亚洲第一精品福利| 台湾av在线二三区观看| 日韩精品欧美国产精品忘忧草 | 国产乱码精品一区二区三区中文 | 国产亚洲精品成人a| 极品美女销魂一区二区三区| 最新中文字幕免费视频| 日韩av一级片| 中文字幕有码av| 蜜桃传媒麻豆第一区在线观看| av在线无限看| 美女www一区二区| 中文字幕av不卡在线| 久久99最新地址| 日本中文字幕在线不卡| 国产成人综合在线| 99精品一区二区三区无码吞精| 成人av在线资源网站| 欧美精品欧美极品欧美激情| 久久午夜电影网| 国产大屁股喷水视频在线观看| 亚洲视频狠狠干| 日韩av在线电影| 午夜不卡在线视频| 99热精品免费| 亚洲一卡二卡三卡四卡无卡久久| 午夜精品一区二区三区视频| 亚洲一区二区中文在线| av大片在线免费观看| 欧美中文字幕亚洲一区二区va在线| 日本免费高清一区| 在线视频91p| 久久国产精品久久久久久久久久| 高h视频在线播放| 日韩美女在线看| crdy在线观看欧美| 精品无码久久久久久久动漫| 欧美色图国产精品| 狠狠噜天天噜日日噜| 亚洲综合激情| 亚洲网中文字幕| 91色乱码一区二区三区| www.99re6| 精品欧美一区二区三区| 亚洲天堂999| 亚洲国产精品资源| 免费的黄网站在线观看| 午夜精品免费视频| 久久三级毛片| 韩日午夜在线资源一区二区| 欧美a级片视频| 国产极品尤物在线| 国内外成人在线| 四虎永久免费影院| 一区二区在线观看av| www.久久精品视频| 欧美变态口味重另类| 成年人视频在线免费观看| 欧美日韩国产成人| 日本精品久久| 欧美一区2区三区4区公司二百| 久久久久久影院| 日韩手机在线观看视频| 国产不卡在线一区| 亚洲a∨无码无在线观看| 亚洲国产日韩a在线播放| 亚洲一区二区三区网站| 日韩精品视频观看| 七七成人影院| 91精品视频大全| jvid福利在线一区二区| koreanbj精品视频一区| 国产精品羞羞答答xxdd| 国产传媒在线看| 色综合天天综合| 色婷婷av一区二区三区之红樱桃| xxx成人少妇69| 亚洲精品.com| 麻豆成人小视频| 亚洲福利一区| 特黄特色免费视频| 亚洲精品水蜜桃| 97caocao| 丝袜亚洲另类欧美重口| 欧洲成人一区| 欧洲精品一区色| 久久亚洲电影| 成人性生交大免费看| 欧美日韩日本国产| 性xxxxbbbb| 91极品视频在线| 久久丝袜视频| 久久综合九色综合88i| 成人精品亚洲人成在线| 免费观看一级视频| 精品捆绑美女sm三区| 青青草原av在线| julia一区二区中文久久94| 亚洲精品一区二区在线看| 欧美成人乱码一二三四区免费| 国产精品美女一区二区在线观看| 精品无码一区二区三区的天堂| 亚洲人成电影网站色| 欧美大胆成人| 免费日韩av电影| 欧美亚洲专区| 日韩视频在线观看免费视频| 欧美性猛片aaaaaaa做受| 成人高清在线| 成人精品在线观看| 欧美视频福利| 中文字幕 日本| 色欧美片视频在线观看在线视频| 国产永久免费高清在线观看| 国产v综合ⅴ日韩v欧美大片| 精品美女久久久| 做a视频在线观看| 一区二区在线观看免费视频播放| 国产自产一区二区| 欧美最近摘花xxxx摘花| 国产精品一区二区99| 亚洲视频一二三四| 亚洲综合在线免费观看| 午夜av免费观看| 日韩av大片在线| 欧美hentaied在线观看| 无码国产精品久久一区免费| 天天做天天摸天天爽国产一区| 你懂的免费在线观看| 国产欧美日韩91| 亚洲网址在线| 天天躁夜夜躁狠狠是什么心态| 欧美日韩精品欧美日韩精品一综合| av网站大全在线| 久久爱av电影| 黄色精品一二区| 亚洲免费在线观看av| 在线电影欧美日韩一区二区私密| 美女日韩一区| 中文字幕无码不卡免费视频| 亚洲女同ⅹxx女同tv| 天天操天天干天天爱| 国产精品一区二区久久国产| 你懂的国产精品| 欧美熟妇一区二区| 日韩一级免费观看| 欧美电影免费观看| 久久久天堂国产精品| 久久综合九色欧美综合狠狠| 国产精品久久久久久在线| 韩国v欧美v日本v亚洲| 欧美mv日韩| 亚洲精品午夜视频| 精品久久99ma| av在线精品| www亚洲成人|