亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

Swift 中閉包的簡(jiǎn)單使用

2020-03-09 17:47:18
字體:
供稿:網(wǎng)友

本文主要是介紹Swift中閉包的簡(jiǎn)單使用,將從“閉包的定義”、"閉包的創(chuàng)建、賦值、調(diào)用"、“閉包常見的幾種使用場(chǎng)景”,"使用閉包可能引起的循環(huán)強(qiáng)引用" 四個(gè)方面入手,重點(diǎn)介紹閉包如何使用,沒有高深的概念,只是專注于實(shí)際使用,屬于入門級(jí)水平,后面還會(huì)有關(guān)于閉包更加詳細(xì)和深入理解的文章。希望大家在閱讀完本文后能夠?qū)﹂]包有一個(gè)整體的理解以及能夠簡(jiǎn)單的使用它。

閉包的定義

在Swift開發(fā)文檔中是這樣介紹閉包的:閉包是可以在你的代碼中被傳遞和引用的功能性獨(dú)立模塊。Swift 中的閉包和 C 以及 Objective-C 中的 block 很像,還有其他語言中的匿名函數(shù)也類似。閉包的作用主要是:夠捕獲和存儲(chǔ)定義在其上下文中的任何常量和變量的引用, 能夠?yàn)槟闾幚硭嘘P(guān)于捕獲的內(nèi)存管理的操作(概念性問題,可以不用糾結(jié)太多啦)。

閉包的表達(dá)式語法

閉包表達(dá)式語法有如下的一般形式:

 { (parameters/接收的參數(shù)) -> (return type/閉包返回值類型) in  statements/保存在閉包中需要執(zhí)行的代碼 }

閉包根據(jù)你的需求是有類型的,閉包的類型 一般形式如下:

(parameters/接收的參數(shù)) -> (return type/閉包返回值類型)

利用typealias為閉包類型定義別名

這里先介紹一下 typealias的使用 : typealias是Swift中用來為已經(jīng)存在的類型重新定義名字的關(guān)鍵字(類似于OC語法中的 typedef),重新命名的新名字用來替代之前的類型,并且能夠使代碼變得更加清晰簡(jiǎn)單容易理解。typealias 的用法很簡(jiǎn)單,直接用 = 賦值就可以了:

typealias <type name> = <type expression>

這里我們可以用 typealias 來為看似較為復(fù)雜的閉包類型定義別名,這樣以后我們就可以用別名直接去申明這樣類型的閉包了,例子如下:

//為沒有參數(shù)也沒有返回值的閉包類型起一個(gè)別名 typealias Nothing = () -> () //如果閉包的沒有返回值,那么我們還可以這樣寫, typealias Anything = () -> Void //為接受一個(gè)Int類型的參數(shù)不返回任何值的閉包類型 定義一個(gè)別名:PrintNumber typealias PrintNumber = (Int) -> () //為接受兩個(gè)Int類型的參數(shù)并且返回一個(gè)Int類型的值的閉包類型 定義一個(gè)別名:Add typealias Add = (Int, Int) -> (Int)

閉包是否接受參數(shù)、接受幾個(gè)參數(shù)、返回什么類型的值完全取決于你的需求。

閉包的創(chuàng)建、賦值、調(diào)用

閉包表達(dá)式語法能夠使用常量形式參數(shù)、變量形式參數(shù)和輸入輸出形式參數(shù),但不能提供默認(rèn)值??勺冃问絽?shù)也能使用,但需要在形式參數(shù)列表的最后面使用。元組也可被用來作為形式參數(shù)和返回類型。在閉包的中會(huì)用到一個(gè)關(guān)鍵字in,in 可以看做是一個(gè)分割符,他把該閉包的類型和閉包的函數(shù)體分開,in前面是該閉包的類型,in后面是具體閉包調(diào)用時(shí)保存的需要執(zhí)行的代碼。表示該閉包的形式參數(shù)類型和返回類型定義已經(jīng)完成,并且閉包的函數(shù)體即將開始執(zhí)行。這里總結(jié)了一下可能用到的幾種形式實(shí)現(xiàn)閉包的創(chuàng)建、賦值、調(diào)用的過程。例子如下:

方式一:利用typealias最完整的創(chuàng)建

//為(_ num1: Int, _ num2: Int) -> (Int) 類型的閉包定義別名:Add typealias Add = (_ num1: Int, _ num2: Int) -> (Int)//創(chuàng)建一個(gè) Add 類型的閉包常量:addCloser1 let addCloser1: Add//為已經(jīng)創(chuàng)建好的常量 addCloser1 賦值 addCloser1 = {  (_ num1: Int, _ num2: Int) -> (Int) in  return num1 + num2 }//調(diào)用閉包并接受返回值 let result = addCloser1(20, 10)

形式二:閉包類型申明和變量的創(chuàng)建合并在一起

//創(chuàng)建一個(gè) (_ num1: Int, _ num2: Int) -> (Int) 類型的閉包常量:addCloser1 let addCloser1: (_ num1: Int, _ num2: Int) -> (Int)//為已經(jīng)創(chuàng)建好的常量 addCloser1 賦值 addCloser1 = {   (_ num1: Int, _ num2: Int) -> (Int) in   return num1 + num2 } //調(diào)用閉包并接受返回值 let result = addCloser1(20, 10)

形式三:省略閉包接收的形參、省略閉包體中返回值

//創(chuàng)建一個(gè) (Int, Int) -> (Int) 類型的閉包常量:addCloser1 let addCloser1: (Int, Int) -> (Int)//為已經(jīng)創(chuàng)建好的常量 addCloser1 賦值 addCloser1 = {   (num1, num2) in   return num1 + num2 }//調(diào)用閉包并接受返回值 let result = addCloser1(20, 10)

形式四:在形式三的基礎(chǔ)上進(jìn)一步精簡(jiǎn)

//創(chuàng)建一個(gè) (Int, Int) -> (Int) 類型的閉包常量:addCloser1 并賦值 let addCloser1: (Int, Int) -> (Int) = {   (num1, num2) in   return num1 + num2  } //調(diào)用閉包并接受返回值 let result = addCloser1(20, 10)

形式五:如果閉包沒有接收參數(shù)省略in

//創(chuàng)建一個(gè) () -> (String) 類型的閉包常量:addCloser1 并賦值  let addCloser1: () -> (String) = {   return "這個(gè)閉包沒有參數(shù),但是有返回值"   } //調(diào)用閉包并接受返回值  let result = addCloser1()

形式六:簡(jiǎn)寫的實(shí)際參數(shù)名

//創(chuàng)建一個(gè) (String, String) -> (String) 類型的閉包常量:addCloser1 并賦值  let addCloser1: (String, String) -> (String) = {   return "閉包的返回值是:/($0),/($1)"   } //調(diào)用閉包并接受返回值  let result = addCloser1("Hello", "Swift!")

說明: 得益于Swift的類型推斷機(jī)制,我們?cè)谑褂瞄]包的時(shí)候可以省略很多東西,而且Swift自動(dòng)對(duì)行內(nèi)閉包提供簡(jiǎn)寫實(shí)際參數(shù)名,你也可以通過 $0, $1, $2 等名字來引用閉包的實(shí)際參數(shù)值。如果你在閉包表達(dá)式中使用這些簡(jiǎn)寫實(shí)際參數(shù)名,那么你可以在閉包的實(shí)際參數(shù)列表中忽略對(duì)其的定義,并且簡(jiǎn)寫實(shí)際參數(shù)名的數(shù)字和類型將會(huì)從期望的函數(shù)類型中推斷出來。in關(guān)鍵字也能被省略,$0 和 $1 分別是閉包的第一個(gè)和第二個(gè) String類型的 實(shí)際參數(shù)(引自文檔翻譯)。

閉包常見的幾種使用場(chǎng)景

基本掌握閉包的概念后,我們就可以利用閉包做事情了,下面介紹一下閉包在開發(fā)中的可能被用到的場(chǎng)景。
場(chǎng)景一:利用閉包傳值
開發(fā)過程中常常會(huì)有這樣的需求:一個(gè)頁面的得到的數(shù)據(jù)需要傳遞給前一個(gè)頁面使用。這時(shí)候使用閉包可以很簡(jiǎn)單的實(shí)現(xiàn)兩個(gè)頁面之間傳值。

Swift,閉包,閉包詳解,閉包實(shí)例
圖片發(fā)自簡(jiǎn)書App

場(chǎng)景再現(xiàn):

第一個(gè)界面中有一個(gè)用來顯示文字的UILabel和一個(gè)點(diǎn)擊進(jìn)入到第二個(gè)界面的UIButton,第二個(gè)界面中有一個(gè)文本框UITextField和一個(gè)點(diǎn)擊返回到上一個(gè)界面的UIButton,現(xiàn)在的需求是在第二個(gè)界面的UITextField中輸入完文字后,點(diǎn)擊返回按鈕返回到第一個(gè)界面并且將輸入的文字顯示在第一個(gè)界面(當(dāng)前頁面)的UILabel中。

實(shí)現(xiàn)代碼:

首先在第二個(gè)界面的控制器中定義一個(gè)( String) -> ()可選類型的閉包常量closer作為SecondViewController的屬性。closer接收一個(gè)String類型的參數(shù)(就是輸入的文字)并且沒有返回值。然后在返回按鈕的點(diǎn)擊事件中傳遞參數(shù)執(zhí)行閉包。

import UIKitclass SecondViewController: UIViewController { //輸入文本框 @IBOutlet weak var textField: UITextField! //為創(chuàng)建一個(gè)(String) -> () 的可選類型的閉包變量作為控制器的屬性 var closer: ((String) -> ())? //返回按鈕的點(diǎn)擊事件 @IBAction func backButtonDidClick(_ sender: AnyObject) {  //首先判斷closer閉包是否已經(jīng)被賦值,如果已經(jīng)有值,直接調(diào)用該閉包,并將輸入的文字傳進(jìn)去。  if closer != nil {   closer!(textField.text!)  }  navigationController?.popViewController(animated: true) }}

這里有一個(gè)注意點(diǎn):我們?cè)跒镾econdViewController定義變量閉包屬性的時(shí)候需要將類型申明為可選類型,閉包可選類型應(yīng)該是((String) -> ())?而不是(String) -> ()?的,后者指的是閉包的返回值是可選類型。

回到第一個(gè)界面的控制器中,我們需要拖線拿到UILabel的控件,然后重寫prepare(for segue: UIStoryboardSegue, sender:Any?) { }方法,在這個(gè)跳轉(zhuǎn)方法中拿到跳轉(zhuǎn)的目標(biāo)控制器SecondVC并為他的閉包屬性賦值,當(dāng)然如果你的跳轉(zhuǎn)按鈕的點(diǎn)擊事件是自己處理的,直接在按鈕的點(diǎn)擊事件中這樣做就OK了。

import UIKitclass FirstViewController: UIViewController { //顯示文字的label @IBOutlet weak var label: UILabel! //重寫這個(gè)方法 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {  //拿到跳轉(zhuǎn)的目標(biāo)控制器  let secondVC = segue.destination as! SecondViewController  //為目標(biāo)控制器的閉包屬性賦值  secondVC.closer = {   //將閉包的參數(shù)(輸入的文本內(nèi)容)顯示在label上   self.label.text = $0  } }}

經(jīng)過上面的處理,我們就可以實(shí)現(xiàn)兩個(gè)頁面之間的傳值了(是不是很簡(jiǎn)單呢),當(dāng)然在具體的開發(fā)中很可能不是傳遞文本內(nèi)容這么簡(jiǎn)單,當(dāng)需要傳遞更復(fù)雜的值時(shí),我們可以將傳遞的值包裝成一個(gè)模型,直接用閉包傳遞模型就好了。

場(chǎng)景二:閉包作為函數(shù)的參數(shù)

在OC語法中block可以作為函數(shù)的參數(shù)進(jìn)行傳遞,在Swift中同樣可以用閉包作為函數(shù)的參數(shù),還記得上面利用typealias關(guān)鍵字定義別名嗎,定義完的別名就是一個(gè)閉包類型,可以用它申明一個(gè)閉包常量或變量當(dāng)做參數(shù)進(jìn)行傳遞。一個(gè)最簡(jiǎn)單的閉包作為函數(shù)參數(shù)例子如下:

//為接受一個(gè)Int類型的參數(shù)并且返回一個(gè)Int類型的值的閉包類型定義一個(gè)別名:Number typealias Number = (num1: Int) -> (Int) //定義一個(gè)接收Number類型的參數(shù)沒有返回值的方法 func Text(num: Number) {  //code }

閉包在作為函數(shù)的參數(shù)進(jìn)行傳遞的時(shí)候根據(jù)函數(shù)接收參數(shù)的情況有很多種不同的寫法。這里我們主要介紹一下尾隨閉包的概念。

首先看一下一般形式的閉包作為函數(shù)的參數(shù)傳遞:

//拼接兩個(gè)字符串和一個(gè)整數(shù) func combine(handle:(String, String) -> (Void), num: Int) {   handle("hello", "world /(num)")  }//方法調(diào)用 combine(handle: { (text, text1) -> (Void) in   print("/(text) /(text1)")   }, num: 2016)

可以看到上面的combine方法在主動(dòng)調(diào)用的時(shí)候依舊是按照func(形參: 實(shí)參)這樣的格式。當(dāng)我們把閉包作為函數(shù)的最后一個(gè)參數(shù)的時(shí)候就引出了尾隨閉包的概念。

一,尾隨閉包

尾隨閉包是指當(dāng)需要將一個(gè)很長(zhǎng)的閉包表達(dá)式作為函數(shù)最后一個(gè)實(shí)際參數(shù)傳遞給函數(shù)時(shí),一個(gè)書寫在函數(shù)形式參數(shù)的括號(hào)外面(后面)的閉包表達(dá)式:

 func combine1(num:Int, handle:(String, String)->(Void)) {   handle("hello", "world /(num)") } combine1(num: 2016) { (text, text1) -> (Void) in   print("/(text) /(text1)") }

進(jìn)一步:如果閉包表達(dá)式被用作函數(shù)唯一的實(shí)際參數(shù)并且你把閉包表達(dá)式用作尾隨閉包,那么調(diào)用這個(gè)函數(shù)的時(shí)候函數(shù)名字的()都可以省略:

 func combine2(handle:(String, String)->(Void)) {   handle("hello", "world") } combine2 { (text, text1) -> (Void) in   print("/(text) /(text1)") }

二,逃逸閉包

如果一個(gè)閉包被作為一個(gè)參數(shù)傳遞給一個(gè)函數(shù),并且在函數(shù)return之后才被喚起執(zhí)行,那么我們稱這個(gè)閉包的參數(shù)是“逃出”這個(gè)函數(shù)體外,這個(gè)閉包就是逃逸閉包。此時(shí)可以在形式參數(shù)前寫 @escaping來明確閉包是允許逃逸的。
閉包可以逃逸的一種方法是被儲(chǔ)存在定義于函數(shù)外的變量里。比如說,很多函數(shù)接收閉包實(shí)際參數(shù)來作為啟動(dòng)異步任務(wù)的回調(diào)。函數(shù)在啟動(dòng)任務(wù)后返回,但是閉包要直到任務(wù)完成——閉包需要逃逸,以便于稍后調(diào)用。用我們最常用的網(wǎng)絡(luò)請(qǐng)求舉例來說:

func request(methodType:RequestMethodType, urlString: String, parameters: [String : AnyObject], completed: @escaping (AnyObject?, NSError?) -> ()) {  // 1.封裝成功的回調(diào)  let successCallBack = { (task : URLSessionDataTask?, result : Any?) -> Void in   completed(result as AnyObject?, nil)  }  // 2.封裝失敗的回調(diào)  let failureCallBack = { (task : URLSessionDataTask?, error : Error?) -> Void in   completed(nil, error as NSError?)  }  //判斷是哪種請(qǐng)求方式  if methodType == .get {   get(urlString, parameters: parameters, success: successCallBack, failure: failureCallBack)  } else {   post(urlString, parameters: parameters, success: successCallBack, failure: failureCallBack)  } }

這里的completed閉包被作為一個(gè)參數(shù)傳遞給request函數(shù),并且在函數(shù)調(diào)用get或post后才會(huì)被調(diào)用。

使用閉包可能引起的循環(huán)強(qiáng)引用
Swift中不當(dāng)?shù)氖褂瞄]包可能會(huì)引起循環(huán)強(qiáng)引用,之所以稱之為“強(qiáng)”引用,是因?yàn)樗鼤?huì)將實(shí)例保持住,只要強(qiáng)引用還在,實(shí)例是不允許被銷毀的。循環(huán)強(qiáng)引用會(huì)一直阻止類實(shí)例的釋放,這就在你的應(yīng)用程序中造成了內(nèi)存泄漏。
舉個(gè)例子:

import UIKitclass ThirdViewController: UIViewController { var callBack: ((String) -> ())? override func viewDidLoad() {  super.viewDidLoad()  printString { (text) in   print(text)   //閉包中捕獲了self   self.view.backgroundColor = UIColor.red  } } func printString(callBack:@escaping (String) -> ()) {  callBack("這個(gè)閉包返回一段文字")  //控制器強(qiáng)引用于著callBack  self.callBack = callBack } deinit {  print("ThirdViewController---釋放了") }}

Swift,閉包,閉包詳解,閉包實(shí)例

當(dāng)你在定義printString這個(gè)方法時(shí)執(zhí)行self.callBack = callBack代碼實(shí)際上是self對(duì)callBack閉包進(jìn)行了強(qiáng)引用,到這里其實(shí)并沒有產(chǎn)生循環(huán)引用,但是當(dāng)你在調(diào)用printString方法的閉包里面又訪問了self.view.backgroundColor屬性,此時(shí)強(qiáng)引用就發(fā)生了,即self引用了callBack,而callBack內(nèi)部又引用著self,誰都不愿意松手,我們就說這兩者之間產(chǎn)生了循環(huán)強(qiáng)引用。

使用閉包何時(shí)會(huì)出現(xiàn)循環(huán)強(qiáng)引用 :

當(dāng)你把一個(gè)閉包分配給類實(shí)例屬性的時(shí)候,并且這個(gè)閉包中又捕獲了這個(gè)實(shí)例。捕獲可能發(fā)生于這個(gè)閉包函數(shù)體中訪問了實(shí)例的某個(gè)屬性,比如 self.someProperty ,或者這個(gè)閉包調(diào)用了一個(gè)實(shí)例的方法,例如 self.someMethod() 。這兩種情況都導(dǎo)致了閉包捕獲了self ,從而產(chǎn)生了循環(huán)強(qiáng)引用。

閉包循環(huán)引用的本質(zhì)是:

閉包中循環(huán)強(qiáng)引用的產(chǎn)生,是因?yàn)殚]包和類相似(還有一種兩個(gè)類實(shí)例之間的循環(huán)強(qiáng)引用),都是引用類型。當(dāng)你把閉包賦值給了一個(gè)屬性,你實(shí)際上是把一個(gè)引用賦值給了這個(gè)閉包。兩個(gè)強(qiáng)引用讓彼此一直有效。

如何解決閉包的循環(huán)強(qiáng)引用:

方式一:類似于OC中使用__weak解決block的循環(huán)引用,Swift中支持使用weak關(guān)鍵字將類實(shí)例聲明為弱引用類型(注意,弱引用類型總是可選類型),打破類實(shí)例對(duì)閉包的強(qiáng)引用,當(dāng)對(duì)象銷毀之后會(huì)自動(dòng)置為nil,對(duì)nil進(jìn)行任何操作不會(huì)有反應(yīng)。

import UIKitclass ThirdViewController: UIViewController { var callBack: ((String) -> ())? override func viewDidLoad() {  super.viewDidLoad()  //將self申明為弱引用類型,打破循環(huán)引用  weak var weakSelf = self  printString { (text) in   print(text)   //閉包中鋪捕獲了self   weakSelf?.view.backgroundColor = UIColor.red  } } func printString(callBack:@escaping (String) -> ()) {  callBack("這個(gè)閉包返回一段文字")  //控制器強(qiáng)引用于著callBack  self.callBack = callBack } deinit {  print("ThirdViewController---釋放了") }}

方式二:作為第一種方式的簡(jiǎn)化操作,我們可以在閉包的第一個(gè)大括號(hào)后面緊接著插入這段代碼[weak self],后面的代碼直接使用self?也能解決循環(huán)引用的問題。

import UIKitclass ThirdViewController: UIViewController {  var callBack: ((String) -> ())?  override func viewDidLoad() {    super.viewDidLoad()    printString {[weak self] (text) in      print(text)      self?.view.backgroundColor = UIColor.red    }  }  func printString(callBack:@escaping (String) -> ()) {    callBack("這個(gè)閉包返回一段文字")    //控制器強(qiáng)引用于著callBack    self.callBack = callBack  }  deinit {    print("ThirdViewController---釋放了")  }}

方式三:在閉包和捕獲的實(shí)例總是互相引用并且總是同時(shí)釋放時(shí),可以將閉包內(nèi)的捕獲定義為無主引用unowned。

import UIKitclass ThirdViewController: UIViewController {  var callBack: ((String) -> ())?  override func viewDidLoad() {    super.viewDidLoad()    printString {[unowned self] (text) in      print(text)      self?.view.backgroundColor = UIColor.red    }  }  func printString(callBack:@escaping (String) -> ()) {    callBack("這個(gè)閉包返回一段文字")    //控制器強(qiáng)引用于著callBack    self.callBack = callBack  }  deinit {    print("ThirdViewController---釋放了")  }}

注意:unowned是Swift中另外一種解決循環(huán)引用的申明無主引用類型的關(guān)鍵字,類似于OC中的__unsafe_unretained;大家都知道__weak和__unsafe_unretained的相同點(diǎn)是可以將該關(guān)鍵字修飾的對(duì)象變成弱引用解決可能存在的循環(huán)引用。不同點(diǎn)在于前者修飾的對(duì)象如果發(fā)現(xiàn)被銷毀,那么指向該對(duì)象的指針會(huì)立即指向nil,而__unsafe_unretained修飾的對(duì)象如果發(fā)現(xiàn)被銷毀,指向該對(duì)象的指針依然指向原來的內(nèi)存地址,如果此時(shí)繼續(xù)訪問該對(duì)象很容易產(chǎn)生壞內(nèi)存訪問/野指針/僵尸對(duì)象訪問。
同樣的道理Swift中也是一樣的。和弱引用類似,無主引用不會(huì)牢牢保持住引用的實(shí)例。但是不像弱引用,總之,無主引用假定是永遠(yuǎn)有值的。因此,無主引用總是被定義為非可選類型。你可以在聲明屬性或者變量時(shí),在前面加上關(guān)鍵字unowned 表示這是一個(gè)無主引用。由于無主引用是非可選類型,你不需要在使用它的時(shí)候?qū)⑺归_。無主引用總是可以直接訪問。不過 ARC 無法在實(shí)例被釋放后將無主引用設(shè)為 nil ,因?yàn)榉强蛇x類型的變量不允許被賦值為 nil 。如果此時(shí)繼續(xù)訪問已經(jīng)被釋放實(shí)例很容易產(chǎn)生壞內(nèi)存訪問/野指針/僵尸對(duì)象訪問。

所以Swift建議我們?nèi)绻徊东@的引用永遠(yuǎn)不為 nil ,應(yīng)該用unowned而不是weak,相反,如果你不確定閉包中捕獲的引用是不是存在為nil的可能,你應(yīng)該使用weak。

以上的代碼是根據(jù)最新的Swift3.0語法編寫的,經(jīng)本人在Xcode8.0、iOS10.0環(huán)境下編譯通過。有任何疑問歡迎在評(píng)論區(qū)留言,感覺大家的閱讀。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到swift教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
日本一区二区中文字幕| 91香蕉视频免费在线观看| 国产精品99精品无码视| 亚洲伊人伊色伊影伊综合网| 国产日本在线观看| 国产成人a v| 国产成人无码精品久久久性色| 日批视频免费观看| 在线视频日韩欧美| 精品免费国产一区二区三区四区| 欧美日韩国内| 97精品视频在线观看自产线路二| 亚洲欧美另类日韩| 亚洲国产成人私人影院tom| 国产免费裸体视频| 日本久久久久久久久久久| 91亚洲国产成人精品一区| 99热在线免费观看| 精品国产va久久久久久久| 疯狂蹂躏欧美一区二区精品| 日韩视频一区二区三区在线播放| 色呦呦网站在线观看| 欧美动漫一区二区| 欧美乱妇40p| 亚洲一线二线三线视频| 欧美成人milf| 91视频福利网| 奇米影视7777精品一区二区| 熟女熟妇伦久久影院毛片一区二区| 亚洲激情影院| 影音先锋日韩有码| 国产艳妇疯狂做爰视频| 亚洲欧美日韩一区二区三区在线观看| 三级全黄视频| 美女被啪啪一区二区| 精品中文字幕一区二区小辣椒| 亚洲系列第一页| 中文久久精品| 在线无限看免费粉色视频| 免费观看一区二区三区| 刘亦菲一区二区三区免费看| 色拍拍在线精品视频8848| 午夜一区二区三区免费| 久久精品久久久久久国产 免费| 97人洗澡人人免费公开视频碰碰碰| 婷婷中文字幕综合| 欧美肥妇bbwbbw| 日韩午夜中文字幕| 粉嫩高清一区二区三区精品视频| 久久午夜精品一区二区| 国产午夜福利片| www.亚洲人.com| 天天做夜夜做人人爱精品| 四虎影院在线免费播放| 国产在线导航| 中文字幕人成人乱码亚洲电影| www.欧美国产| 三级黄色录像视频| 丝袜美腿小色网| www.综合网.com| 在线视频这里只有精品| 国产毛片精品| 99精品视频一区二区| 色播色播色播色播色播在线| 97久久超碰国产精品电影| 小泽玛利亚av在线| 欧美77777免费视频| 精品国内亚洲在观看18黄| 无码精品人妻一区二区三区影院| 色偷偷9999www| 国产精品无码一本二本三本色| 亚洲私拍自拍| 亚洲一区二区三区免费看| bestiality新另类大全| 精品少妇theporn| 国产又大又硬又粗| 亚洲精品无人区| 久久久综合香蕉尹人综合网| 免费看亚洲片| 欧美午夜视频在线观看| 国产成人精品免高潮费视频| 日本 国产 欧美色综合| 先锋影音资源综合在线播放av| www.成人爱| 亚洲欧美另类在线| 精品国产一区二区三区av片| 欧美日一区二区| 色哟哟无码精品一区二区三区| 欧美影视一区二区三区| 韩国精品视频在线观看| 自拍电影在线观看| 日韩av中文字幕在线播放| 四虎影视最新网址| 免费看黄裸体一级大秀欧美| 可以看美女隐私的网站| 欧美性bbwbbwbbwhd| 黄av在线播放| 亚洲最新免费视频| 欧美videos粗暴高清性| 亚洲一区二区视频| 国产在线播放一区三区四| 日韩在线卡一卡二| 最近看过的日韩成人| 在线免费观看视频黄| 国产亚洲精品久久久久婷婷瑜伽| 97视频在线观看免费高清完整版在线观看| 中文字幕无线码| 羞羞视频网站| 欧美日韩精品二区| 久久精品一级| 羞羞的视频在线观看| 欧美三级超在线视频| 天堂网在线最新版www中文网| 一区二区国产在线观看| 中文字幕日韩电影| 国产在线一区不卡| 成人高清在线| 97影院手机在线观看| 男人的天堂免费| 国产精品美女免费| 久久久国产一区二区| 人人干人人看| av一本久道久久综合久久鬼色| 欧美一卡二卡| 在线免费视频一区二区| 国产极品人妖在线观看| 国产精品视频二区三区| 久久精品亚洲94久久精品| 波多野结衣加勒比| 欧美三级在线视频| 亚洲欧美国产一区二区| 麻豆freexxxx性91精品| 国产又黄又大久久| 一本一本久久| 久久久一区二区三区四区| 国产亚洲一本大道中文在线| 免费毛片在线播放| 91电影91视频| 亚洲美女免费在线| 欧美精品久久| 国产午夜福利在线播放| 成人免费看片视频| 在线播放的av| 成人永久免费视频| 亚洲免费网站| 亚洲毛片在线免费观看| 亚洲一区二区三区四区中文| 欧美精品一级二级| 暖暖成人免费视频| jizzjizz中文| 亚洲国产毛片aaaaa无费看| 国产精品原创视频| 一区二区传媒有限公司| 在线观看三级视频| 国产成+人+日韩+欧美+亚洲| 色婷婷av一区二区三区gif| 99久久精品免费看国产小宝寻花| 亚洲国产精品成人综合| 久久久久亚洲精品成人网小说| 亚洲男女自偷自拍图片另类| 97人澡人人添人人爽欧美| 欧美一区二区三区免费视| jizzjizz日本少妇| 97最新国自产拍视频在线完整在线看| 99成人国产精品视频| 成人av在线资源| 蜜臀av一区二区三区有限公司| 国产综合色精品一区二区三区| 91精品福利观看| 性欧美ⅴideo另类hd| 国内精品国语自产拍在线观看| 黄片毛片在线看| 亚洲美女福利视频| 欧美精品一区二区三区在线看午夜| 无码精品人妻一区二区三区影院| 欧美伊人久久| 成人免费网站视频| 黑人糟蹋人妻hd中文字幕| 欧美激情一级欧美精品| 妞干网在线播放| 正在播放日韩欧美一页| 一区二区三区欧美在线| 日韩人妻一区二区三区蜜桃视频| 国产三级精品三级在线观看| 国产美女福利在线观看| 欧美三区在线视频| 免费 成 人 黄 色| 18视频在线观看娇喘| 国产亚洲成精品久久| 久久影院电视剧免费观看| 精品国产一区二区三区av片| 欧美中文字幕一区二区三区| 特种兵之深入敌后| 黑料吃瓜在线观看| 青春草在线观看| 在线视频超级| 夜夜精品视频一区二区| 91网页版在线登录入口| 欧美日韩在线网站| 色婷婷**av毛片一区| 欧美三级视频在线播放| 日韩激情在线播放| 国产精品成人aaaa在线| 久久精品一区二区三区不卡牛牛| 影音先锋男人在线| 日韩欧美在线观看一区二区| 日韩精品――中文字幕| 日韩三级av| 国产又猛又黄的视频| 国产成人午夜视频网址| 日本欧美www| 亚洲一二三专区| 久久青草精品视频免费观看| 91精品久久久久久久| 欧美视频一区二区三区四区| 中文字幕免费高清视频| 91美女视频| 精品国产区一区二区三区在线观看| 欧美日韩在线观看首页| 国产精品日韩久久久| 91精品国产乱码久久久久久蜜臀| 国产在线视频精品一区| 国产精品丝袜在线播放| 国产精品xvideos88| 性色av一区| 粗大黑人巨茎大战欧美成人| 久久亚洲精华国产精华液| 中文字幕伦理片| 中文字幕亚洲一区二区三区| 成熟的女同志hd| 国产成a人亚洲精v品在线观看| 国产精品亚洲激情| 国产69精品久久久久9999人| 亚洲中文字幕无码av永久| 综合激情网...| 亚洲最大色综合成人av| 免费av一级电影| 日韩和欧美一区二区三区| 麻豆精品一区二区三区| 小说区图片区综合久久亚洲| 热re99久久精品国产99热| 日韩一级不卡| 亚洲精品久久久久久国产精华液| 一本一道久久a久久精品逆3p| 天天射天天操天天干| 小视频免费在线观看| 九色精品免费永久在线| www.夜夜| 亚洲va欧美va国产va天堂影院| 国产精品午夜福利| 色先锋av影音| 成人网ww555视频免费看| 91国视频在线| 日韩欧美亚洲日产国| 精品免费一区二区三区蜜桃| 男女羞羞视频在线观看| 日产精品久久久久久久性色| 成人动漫h在线观看| 亚洲精品欧美| gogo人体一区| www.三级.com| 国产欧美一区二区三区在线| 韩国三级成人在线| 欧美专区日韩视频| 香蕉视频911| 欧美成人精品激情在线观看| 日韩欧美猛交xxxxx无码| 一区二区三区四区免费观看| 人妻少妇精品视频一区二区三区| 欧美激情aaa| 成人午夜电影小说| 国产精品一区二区中文字幕| 欧美日韩国产另类一区| 日本不卡二区| 久久亚洲精品一区| 国产欧美综合一区| 91免费视频国产| 中文字幕在线视频一区二区| 黄色国产网站在线播放| 97人人澡人人爽| 色噜噜日韩精品欧美一区二区| 91香蕉国产在线观看软件| 国产三级做爰在线观看| 26uuu国产在线精品一区二区| 色综合天天狠狠| 天天操天天射天天色| 国产精品第八页| 在线观看欧美成人| 中文字幕日韩在线观看| 在线精品在线| 国产精品乱码一区二区三区| 水莓100国产免费av在线播放| 亚洲www啪成人一区二区| 免费人成a大片在线观看动漫| www.99re7| 99久久精品免费看| 中文字幕av免费专区久久| 日韩少妇内射免费播放18禁裸乳| 先锋影音二区| 欧美videos另类齐全| 国产v日产∨综合v精品视频| 在线欧美一区| 中文字幕一区二区三| 殴美一级特黄aaaaaa| 欧洲一区二区三区| 午夜精品久久久久久久无码| 毛片av一区二区三区| 看高清中日韩色视频| 精品国产一区二区三区香蕉沈先生| 一本久道久久综合多人| 国产成人女人毛片视频在线| 香蕉久久夜色精品国产使用方法| 日本不卡一区二区三区| 欧美日韩hd| 91沈先生播放一区二区| 中文字幕国产日韩| 久久久久久久亚洲精品| 成年免费视频黄网站在线观看| 日韩午夜视频在线| 自拍偷拍亚洲一区| 色综合老司机第九色激情| 亚洲色成人www永久在线观看| 久久久精品动漫| 九九久久久久久久久激情| 亚洲欧美中文日韩在线v日本| 91麻豆精品国产91久久久使用方法| 91免费版黄色| 日韩久久精品电影|