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

解密-神秘的RunLoop

移動開發 iOS
一直以來RunLoop就是個神秘的領域,好多2.3年的開發者都不能準確的表述它的作用,說它神秘,其實RunLoop并沒有大家想象中的那么神秘,那么不好理解,本文就帶大家好好剖析一下”神秘的RunLoop”。

引言

一直以來RunLoop就是個神秘的領域,好多2.3年的開發者都不能準確的表述它的作用,說它神秘,其實RunLoop并沒有大家想象中的那么神秘,那么不好理解,本文就帶大家好好剖析一下”神秘的RunLoop”

什么是RunLoop

從字面上看

  • 運行循環
  • 跑圈 

 

 

[[184147]] 

循環

基本作用

  • 保持程序的持續運行(比如主運行循環)
  • 處理App中的各種事件(比如觸摸事件、定時器事件、Selector事件)
  • 節省CPU資源,提高程序性能:該做事時做事,該休息時休息

存在價值 

 

 

 

沒有RunLoop 

 

 

 

有RunLoop 

 

 

 

主運行循環

  • 第14行代碼的UIApplicationMain函數內部就啟動了一個RunLoop
  • 所以UIApplicationMain函數一直沒有返回,保持了程序的持續運行
  • 這個默認啟動的RunLoop是跟主線程相關聯的

RunLoop對象

  • iOS中有2套API來訪問和使用RunLoop

Foundation

NSRunLoop

Core Foundation

CFRunLoopRef

  • NSRunLoop和CFRunLoopRef都代表著RunLoop對象
  • NSRunLoop是基于CFRunLoopRef的一層OC包裝,所以要了解RunLoop內部結構,需要多研究CFRunLoopRef層面的API(Core Foundation層面)

RunLoop資料

  • 蘋果官方文檔

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html

  • CFRunLoopRef是開源的

http://opensource.apple.com/source/CF/CF-1151.16/

RunLoop與線程

每條線程都有唯一的一個與之對應的RunLoop對象

主線程的RunLoop已經自動創建好了,子線程的RunLoop需要主動創建

RunLoop在***次獲取時創建,在線程結束時銷毀

獲取RunLoop對象

  • Foundation
  1. [NSRunLoop currentRunLoop]; // 獲得當前線程的RunLoop對象 
  2.  
  3. [NSRunLoop mainRunLoop]; // 獲得主線程的RunLoop對象  
  • Core Foundation
  1. CFRunLoopGetCurrent(); // 獲得當前線程的RunLoop對象 
  2.  
  3. CFRunLoopGetMain(); // 獲得主線程的RunLoop對象  

RunLoop相關類

  • Core Foundation中關于RunLoop的5個類

CFRunLoopRef

CFRunLoopModeRef

CFRunLoopSourceRef

CFRunLoopTimerRef

CFRunLoopObserverRef

注:RunLoop如果沒有這些東西 會直接退出

CFRunLoopModeRef

  • CFRunLoopModeRef代表RunLoop的運行模式

一個 RunLoop 包含若干個 Mode,每個Mode又包含若干個Source/Timer/Observer

每次RunLoop啟動時,只能指定其中一個 Mode,這個Mode被稱作 CurrentMode

如果需要切換Mode,只能退出Loop,再重新指定一個Mode進入

這樣做主要是為了分隔開不同組的Source/Timer/Observer,讓其互不影響 

 

 

相關類 

相關類

系統默認注冊了5個Mode:(前兩個跟***一個常用)

  • kCFRunLoopDefaultMode:App的默認Mode,通常主線程是在這個Mode下運行
  • UITrackingRunLoopMode:界面跟蹤 Mode,用于 ScrollView 追蹤觸摸滑動,保證界面滑動時不受其他 Mode 影響
  • UIInitializationRunLoopMode: 在剛啟動 App 時第進入的***個 Mode,啟動完成后就不再使用
  • GSEventReceiveRunLoopMode: 接受系統事件的內部 Mode,通常用不到
  • kCFRunLoopCommonModes: 這是一個占位用的Mode,不是一種真正的Mode

CFRunLoopSourceRef

  • CFRunLoopSourceRef是事件源(輸入源)
  • 按照官方文檔的分類

Port-Based Sources (基于端口,跟其他線程交互,通過內核發布的消息)

Custom Input Sources (自定義)

Cocoa Perform Selector Sources (performSelector…方法)

  • 按照函數調用棧的分類

Source0:非基于Port的

Source1:基于Port的

Source0: event事件,只含有回調,需要先調用CFRunLoopSourceSignal(source),將這個 Source 標記為待處理,然后手動調用 CFRunLoopWakeUp(runloop) 來喚醒 RunLoop。

Source1: 包含了一個 mach_port 和一個回調,被用于通過內核和其他線程相互發送消息,能主動喚醒 RunLoop 的線程。

函數調用棧 

 

 

函數調用棧 

函數調用棧

CFRunLoopTimerRef

  • CFRunLoopTimerRef是基于時間的觸發器
  • 基本上說的就是NSTimer(CADisplayLink也是加到RunLoop),它受RunLoop的Mode影響
  • GCD的定時器不受RunLoop的Mode影響

CFRunLoopObserverRef

  • CFRunLoopObserverRef是觀察者,能夠監聽RunLoop的狀態改變
  • 可以監聽的時間點有以下幾個

使用

  1. - (void)observer 
  2.  
  3.  
  4.     // 創建observer 
  5.  
  6.     CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(),kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) { 
  7.  
  8.         NSLog(@"----監聽到RunLoop狀態發生改變---%zd", activity); 
  9.  
  10.     }); 
  11.  
  12.   
  13.  
  14.     // 添加觀察者:監聽RunLoop的狀態 
  15.  
  16.     CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode); 
  17.  
  18.   
  19.  
  20.     // 釋放Observer 
  21.  
  22.     CFRelease(observer); 
  23.  

 特別注意

  1. /* 
  2.  
  3.     CF的內存管理(Core Foundation) 
  4.  
  5.     1.凡是帶有Create、Copy、Retain等字眼的函數,創建出來的對象,都需要在***做一次release 
  6.  
  7.     * 比如CFRunLoopObserverCreate 
  8.  
  9.     2.release函數:CFRelease(對象); 
  10.  
  11. */  

RunLoop處理邏輯

– 官方版 

 

 

  

 

 

 

邏輯

– 網友整理版 

 

 

 

網友版

注:進入RunLoop前 會判斷模式是否為空,為空直接退出

RunLoop應用

  • NSTimer
  • ImageView顯示
  • PerformSelector
  • 常駐線程
  • 自動釋放池

1.NSTimer(最常見RunLoop使用)

  1. - (void)timer 
  2.  
  3.  
  4.     NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES]; 
  5.  
  6.     // 定時器只運行在NSDefaultRunLoopMode下,一旦RunLoop進入其他模式,這個定時器就不會工作 
  7.  
  8.     //    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 
  9.  
  10.   
  11.  
  12.     // 定時器只運行在UITrackingRunLoopMode下,一旦RunLoop進入其他模式,這個定時器就不會工作 
  13.  
  14.     //    [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode]; 
  15.  
  16.   
  17.  
  18.     // 定時器會跑在標記為common modes的模式下 
  19.  
  20.     // 標記為common modes的模式:UITrackingRunLoopMode和NSDefaultRunLoopMode兼容 
  21.  
  22.     [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
  23.  
  24.   
  1. - (void)timer2 
  2.  
  3.  
  4.     // 調用了scheduledTimer返回的定時器,已經自動被添加到當前runLoop中,而且是NSDefaultRunLoopMode 
  5.  
  6.     NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nilrepeats:YES]; 
  7.  
  8.   
  9.  
  10.     // 修改模式 
  11.  
  12.     [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
  13.  
  14.  

場景還原

拖拽時模式由NSDefaultRunLoopMode 進入 UITrackingRunLoopMode

此時如下圖: NSTimer 不再響應 圖片停止輪播 

 

 

 

NSDefaultRunLoopMode模式

NSRunLoopCommonModes 模式下兩種模式都可運行

此時如下圖: NSTimer 在兩個模式下都可正常運行 

 

 

 

2.ImageView

需求:當用戶在拖拽時(UI交互時)不顯示圖片,拖拽完成時顯示圖片

方法1 監聽UIScrollerView滾動 (通過UIScrollViewDelegate監聽,此處不再舉例)

方法2 RunLoop 設置運行模式

  1. // 只在NSDefaultRunLoopMode模式下顯示圖片 
  2.  
  3.     [self.imageView performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@"placeholder"]afterDelay:3.0 inModes:@[NSDefaultRunLoopMode]];   

 

 

3.PerformSelector

 

inModes:設置運行模式

4.常駐線程 (重要)

應用場景:經常在后臺進行耗時操作,如:監控聯網狀態,掃描沙盒等 不希望線程處理完事件就銷毀,保持常駐狀態

***種(推薦)

開啟

  1. - (void)run 
  2.  
  3.  
  4.   //addPort:添加端口(就是source)  forMode:設置模式 
  5.  
  6.    [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode]; 
  7.  
  8.   //啟動RunLoop 
  9.  
  10.     [[NSRunLoop currentRunLoop] run]; 
  11.  
  12.   
  13.  
  14. /* 
  15.  
  16.   //另外兩種啟動方式 
  17.  
  18.     [NSDate distantFuture]:遙遠的未來  這種寫法跟上面的run是一個意思 
  19.  
  20.     [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
  21.  
  22.     不設置模式 
  23.  
  24.     [[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]]; 
  25.  
  26.   */ 
  27.  
  28.  

退出-退出當前線程

  1. [NSThread exit]; 

第二種(奇葩法)

優點:退出RunLoop比較方便-定義個標記 while(flag){…}

  1. - (void)run 
  2.  
  3.  
  4.     while (1) { 
  5.  
  6.         [[NSRunLoop currentRunLoop] run]; 
  7.  
  8.     } 
  9.  
  10.  

5.自動釋放池 

 

 

 

在休眠前(kCFRunLoopBeforeWaiting)進行釋放,處理事件前創建釋放池,中間創建的對象會放入釋放池

特別注意:

在啟動RunLoop之前建議用 @autoreleasepool {…}包裹

意義:創建一個大釋放池,釋放{}期間創建的臨時對象,一般好的框架的作者都會這么做

  1. - (void)execute 
  2.  
  3.  
  4.     @autoreleasepool { 
  5.  
  6.         NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES]; 
  7.  
  8.         [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 
  9.  
  10.         [[NSRunLoop currentRunLoop] run]; 
  11.  
  12.     } 
  13.  
  14.  

題外話:

以后為了增加用戶體驗 在用戶UI交互的時候 不做事件處理 我們可以把需要做的操作放到NSDefaultRunLoopMode

補充:GCD定時器

一般的NSTimer定時器因為受到RunLoop,會存在時間不準時的情況.

上文有提到GCD不受RunLoop影響,下面簡單的說一下它的使用

  1. /** 定時器(這里不用帶*,因為dispatch_source_t就是個類,內部已經包含了*) */ 
  2.  
  3. @property (nonatomic, strong) dispatch_source_t timer; 
  4.  
  5.   
  6.  
  7. int count = 0; 
  8.  
  9. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
  10.  
  11.  
  12.     // 獲得隊列 
  13.  
  14. //    dispatch_queue_t queue = dispatch_get_global_queue(0, 0); 
  15.  
  16.     dispatch_queue_t queue = dispatch_get_main_queue(); 
  17.  
  18.   
  19.  
  20.     // 創建一個定時器(dispatch_source_t本質還是個OC對象) 
  21.  
  22.     self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); 
  23.  
  24.   
  25.  
  26.     // 設置定時器的各種屬性(幾時開始任務,每隔多長時間執行一次) 
  27.  
  28.     // GCD的時間參數,一般是納秒 NSEC_PER_SEC(1秒 == 10的9次方納秒) 
  29.  
  30.     // 何時開始執行***個任務 
  31.  
  32.     // dispatch_time(DISPATCH_TIME_NOW, 3.0 * NSEC_PER_SEC) 比當前時間晚3秒 
  33.  
  34.     dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)); 
  35.  
  36.     uint64_t interval = (uint64_t)(1.0 * NSEC_PER_SEC); 
  37.  
  38.     dispatch_source_set_timer(self.timer, start, interval, 0); 
  39.  
  40.   
  41.  
  42.     // 設置回調 
  43.  
  44.     dispatch_source_set_event_handler(self.timer, ^{ 
  45.  
  46.         NSLog(@"------------%@", [NSThread currentThread]); 
  47.  
  48.         count++; 
  49.  
  50.   
  51.  
  52. //        if (count == 4) { 
  53.  
  54. //            // 取消定時器 
  55.  
  56. //            dispatch_cancel(self.timer); 
  57.  
  58. //            self.timer = nil; 
  59.  
  60. //        } 
  61.  
  62.     }); 
  63.  
  64.   
  65.  
  66.     // 啟動定時器 
  67.  
  68.     dispatch_resume(self.timer); 
  69.  
  70.  

RunLoop面試題

經常會有喜歡裝B的面試官,面試的時候就喜歡問RunLoop,其實他真的會嗎? 說不定他自己都不太理解

下面我對有關RunLoop的面試做一個簡單的總結,也算是對全文一個總結

  • 什么是RunLoop?

從字面上看:運行循環、跑圈

其實它內部就是do-while循環,在這個循環內部不斷的處理各種任務(比如Source、Timer、Observer)

一個線程對應一個RunLoop,主線程的RunLoop默認已經啟動,子線程的RunLoop需要手動啟動(調用run方法)

RunLoop只能選擇一個Mode啟動,如果當前Mode中沒有任何Soure、Timer、Observer,那么就直接退出RunLoop

  • 在開發中如何使用RunLoop?什么應用場景?
  • 開啟一個常駐線程(讓一個子線程不進入消亡狀態,等待其他線程發來消息,處理其他事件)

在子線程中開啟一個定時器

在子線程中進行一些長期監控

  • 可以控制定時器在特定模式下執行
  • 可以讓某些事件(行為、任務)在特定模式下執行
  • 可以添加Observer監聽RunLoop的狀態,比如監聽點擊事件的處理(在所有點擊事件之前做一些事情)

***

之前發布的文章寫得不是很完整,我又花了兩天時間重新做了梳理,還有什么不足之處,歡迎大家指出,我會***時間更新.

責任編輯:龐桂玉 來源: iOS大全
相關推薦

2024-08-15 08:56:18

2013-05-09 14:48:26

Windows Blu

2011-08-15 14:27:51

CocoaRunLoop

2019-10-11 10:23:13

ClassLoaderJavaJVM

2014-03-12 11:11:39

Storage vMo虛擬機

2021-06-07 08:18:12

云計算云端阿里云

2011-11-18 09:26:18

Javafinally

2010-05-17 09:13:35

2023-11-02 09:55:40

2009-09-15 15:34:33

Google Fast

2016-09-07 20:41:38

辦公

2011-06-22 09:43:01

C++

2023-04-10 11:00:00

注解Demo源碼

2016-04-06 09:27:10

runtime解密學習

2013-03-27 10:32:53

iOS多線程原理runloop介紹GCD

2018-03-01 09:33:05

軟件定義存儲

2013-08-07 13:25:59

2022-02-23 16:49:19

Linux內存數據結構

2009-06-01 09:04:44

Google WaveWeb

2010-07-05 09:07:42

點贊
收藏

51CTO技術棧公眾號

国产成人在线中文字幕| 日韩精品系列| 欧美三级网页| 精品视频中文字幕| 五月天av在线播放| 波多野结依一区| 国产三级欧美三级日产三级99| 成人精品一区二区三区电影黑人 | 动漫av一区二区三区| 亚洲欧美日韩在线观看a三区| 亚洲最新av网址| 中国特级黄色片| 日韩免费小视频| 亚洲免费观看高清完整版在线观看熊| 久久久精彩视频| 国产片在线播放| 日韩专区在线视频| 欧美激情在线观看| 欧美日韩生活片| 日韩理论电影中文字幕| 欧美一区二区三区四区在线观看| 日韩av在线综合| 日本伦理一区二区| 亚洲欧洲av在线| 欧美激情一区二区三区在线视频 | 欧美特大特白屁股xxxx| 美女扒开腿让男人桶爽久久软| 久久99精品久久久久久国产越南| 91av在线免费观看视频| 无码黑人精品一区二区| 欧洲专线二区三区| 欧美成人一区二区| 欧美一级小视频| 日韩a**中文字幕| 天天影视网天天综合色在线播放| 日本一级淫片演员| 幼a在线观看| 日本一区二区免费在线观看视频 | 午夜精品一区二区三区在线视频| 欧美一级片在线视频| 精品久久影院| 亚洲欧美国产精品久久久久久久 | 国产深喉视频一区二区| 青草国产精品久久久久久| 97超碰国产精品女人人人爽| 麻豆明星ai换脸视频| 97精品视频| 中文字幕欧美在线| 影音先锋男人在线| 国产日产一区| 亚洲午夜久久久久久久| 女~淫辱の触手3d动漫| 欧美大胆a级| 亚洲国产小视频| 手机在线成人av| 超碰在线成人| 亚洲国产成人91精品| 色悠悠在线视频| 波多野结衣欧美| 亚洲国产福利在线| 国产熟女高潮一区二区三区| 国产欧美自拍一区| 亚洲国产精品久久久久| 三级视频网站在线观看| 久久香蕉精品香蕉| 91久久黄色| 亚洲欧美综合图区| 97在线观看免费视频| 欧美偷拍综合| 北条麻妃一区二区三区中文字幕 | 人妻妺妺窝人体色www聚色窝| 成人午夜av电影| 精品蜜桃一区二区三区| 日韩大片b站免费观看直播| www国产精品av| 亚洲成人网上| 成人在线免费看片| 亚洲国产综合在线| 日本在线观看a| 国产美女久久| 欧美一级欧美一级在线播放| 人妻av一区二区三区| 欧美交a欧美精品喷水| 亚洲丝袜av一区| 免费精品在线视频| 亚洲国产91| 欧美一级大片在线免费观看| 最近中文字幕在线观看视频| 九九国产精品视频| 国内外成人免费视频| 国产福利小视频在线观看| 国产精品的网站| 久久这里只有精品8| 粉嫩一区二区| 欧美一级夜夜爽| 极品粉嫩小仙女高潮喷水久久| 国产欧美日韩一区二区三区四区 | segui88久久综合9999| 一本一道波多野结衣一区二区| 一区二区三区入口| av成人app永久免费| 亚洲欧美一区二区三区情侣bbw| 中文字幕第4页| 这里只有精品在线| 日韩av免费在线播放| 国产三级第一页| 久久久99久久精品欧美| 无码日本精品xxxxxxxxx| 成人性生交大片免费网站| 第一会所sis001亚洲| 亚洲国产欧美一区二区三区同亚洲| 中文字幕人妻一区二区三区在线视频| 伊人青青综合网| 国产成人激情视频| 欧美 日韩 国产 精品| 国产精品少妇自拍| 亚洲午夜精品久久久久久人妖| 亚洲成人a级片| 亚洲欧美日韩一区二区在线 | 午夜久久久影院| 中文字幕丰满乱码| 五月国产精品| 欧美精品videossex88| 亚洲天天综合网| 精品一二三四在线| 欧美日韩精品免费在线观看视频| 天天干在线视频论坛| 欧美日韩你懂得| 成都免费高清电影| 9国产精品视频| 91九色蝌蚪成人| 精产国品自在线www| 色综合一个色综合| 理论片大全免费理伦片| 欧美午夜不卡| 亚洲一区亚洲二区| jizzjizz在线观看| 在线看国产一区| 在线不卡av电影| 国产精品外国| 精品无人区一区二区三区| 日本高清成人vr专区| 777午夜精品视频在线播放| 国产一区二区三区四区在线| 久久资源在线| 久久婷婷开心| 999av小视频在线| 亚洲精品国产品国语在线| 久久亚洲AV无码| 丰满亚洲少妇av| 日本人体一区二区| 久久综合社区| 欧美精品videossex性护士| 后入内射欧美99二区视频| 夜夜操天天操亚洲| 日韩欧美中文视频| 911久久香蕉国产线看观看| 国产精品一区二区性色av| 国产黄色在线播放| 欧洲激情一区二区| 福利视频第一页| 国产一区二区在线视频| 法国空姐在线观看免费| 90岁老太婆乱淫| 亚洲成人三区| 成人免费在线看片| 国产自产自拍视频在线观看| 日韩精品在线私人| 日本熟妇一区二区三区| 国产精品久久久久久久午夜片| 中文字幕66页| 国产精品hd| 久久综合一区| jizz欧美| 九九热99久久久国产盗摄| 可以免费观看的毛片| 欧美天堂在线观看| 中文字幕精品亚洲| 国产成人午夜电影网| 精品少妇一区二区三区在线| 中文字幕av一区二区三区人| 国产精品久久久久久亚洲影视| 米奇777四色精品人人爽| 日韩免费福利电影在线观看| 久久久久久久极品| 国产精品免费视频网站| 美女流白浆视频| 香蕉久久国产| 国产精品88久久久久久妇女 | 蜜桃久久久久久久| 超碰10000| 综合亚洲自拍| 成人性生交xxxxx网站| 女人让男人操自己视频在线观看| 夜夜嗨av一区二区三区四区| 国产超碰人人模人人爽人人添| 欧美日韩亚洲一区二区| 国产精品视频看看| 99久久精品国产一区二区三区| 在线观看免费的av| 国产日韩欧美一区| 国产又大又长又粗又黄| 亚洲成a人片77777在线播放 | 国产精品嫩草影院桃色| 五月天激情综合| 任我爽在线视频| 91色在线porny| 91精品国产三级| 日欧美一区二区| 东北少妇不带套对白| 欧美肥老太太性生活| 久久99精品国产99久久| 精品视频一区二区三区在线观看| 日本精品久久久| 91 在线视频| 青青草97国产精品麻豆| 国产精品日韩高清| 91成人app| 国产精品成人观看视频国产奇米| caoprom在线| 久久成人一区二区| wwwxxx在线观看| 亚洲精品自拍偷拍| 免费看av毛片| 日韩视频一区二区在线观看| 在线观看免费高清视频| 狠狠久久五月精品中文字幕| 精品视频一区二区在线观看| 综合久久国产九一剧情麻豆| av手机在线播放| 91色.com| 一区二区视频观看| 岛国精品在线播放| 免费欧美一级片| 国产在线国偷精品产拍免费yy| 成人午夜激情av| 久久一区精品| 日韩手机在线观看视频| 国产亚洲永久域名| 男人添女人下面高潮视频| 亚洲午夜久久久久久尤物| 特大黑人娇小亚洲女mp4| 91精品国产福利在线观看麻豆| 永久域名在线精品| 婷婷亚洲最大| 中文字幕第一页亚洲| 偷偷www综合久久久久久久| 亚洲欧美国产不卡| 97久久夜色精品国产| 杨幂一区欧美专区| 欧美成人激情| 欧美日韩视频免费在线观看| 91欧美日韩| 免费在线精品视频| 欧美日韩少妇| 欧美久久久久久久久久久久久| 欧美日韩一视频区二区| av日韩一区二区三区| 一本综合精品| 国产淫片av片久久久久久| 久久在线精品| 日本中文字幕影院| 久久bbxx| 日韩欧美激情在线| 秋霞欧美在线观看| 亚洲精品美女久久久久| 精品美女视频在线观看免费软件| 亚洲欧美中文日韩在线| 在线中文资源天堂| 久久国产精品视频| 成人免费一区二区三区牛牛| 91av在线看| 久久精品黄色| 97免费高清电视剧观看| 欧美人体视频| 亚洲精品自在在线观看| 综合激情视频| 九色在线视频观看| 免费成人在线观看视频| 五月天婷婷在线观看视频| 99久久精品国产一区二区三区| 国产精品扒开腿做爽爽| 最新久久zyz资源站| 久久影院一区二区| 欧美在线视频不卡| 亚洲成人黄色片| 国产亚洲视频在线观看| 最新国产在线拍揄自揄视频| …久久精品99久久香蕉国产| 高清欧美日韩| 国产一区喷水| 日韩欧美视频| 波多野结衣乳巨码无在线| 蜜臀av国产精品久久久久| 亚洲精品久久一区二区三区777| 91看片淫黄大片一级在线观看| 午夜国产福利视频| 欧美日韩在线一区| 国产露脸国语对白在线| 日韩成人av网址| 操你啦视频在线| 国产盗摄xxxx视频xxx69| 亚洲一级大片| 亚洲一区精彩视频| 午夜在线a亚洲v天堂网2018| 97人人模人人爽人人澡| 日本一区二区在线不卡| 日韩av综合在线| 欧美绝品在线观看成人午夜影视| 免费看黄网站在线观看| 不卡伊人av在线播放| 在线日韩影院| 国产欧美丝袜| 一区二区三区国产精华| 中文字幕第80页| 99国产精品久久| 九九热精彩视频| 777午夜精品免费视频| а√天堂中文在线资源bt在线 | 国产成人久久婷婷精品流白浆| 国产老妇另类xxxxx| 美国黄色特级片| 欧美日韩中文字幕| 天天综合在线视频| 九九视频直播综合网| 永久免费观看精品视频| 欧美激情一区二区三区在线视频 | 欧洲亚洲免费视频| 99亚洲乱人伦aⅴ精品| 亚洲小视频在线播放| 久久av中文字幕片| 国产午夜精品久久久久久久久| 日韩欧美国产成人| 无码精品人妻一区二区| 国内外成人免费激情在线视频网站| 欧美视频免费看| 亚洲三区四区| 美女视频一区二区三区| 美国美女黄色片| 欧美日韩和欧美的一区二区| 国产中文字幕在线播放| 国产精品成人在线| 国产精品美女久久久久久不卡| 18岁网站在线观看| 久久亚洲免费视频| 在线免费黄色av| 亚洲香蕉成视频在线观看| 蜜桃成人精品| 色99中文字幕| 久久国产精品露脸对白| 多男操一女视频| 欧美一级理论片| 香蕉成人app免费看片| 成人午夜电影在线播放| 在线欧美日韩| 噜噜噜在线视频| 色婷婷综合久久久久中文一区二区 | 久久综合图片| 欧美黄色一级生活片| 色综合天天综合网国产成人综合天 | 国产精品亚洲d| 五码日韩精品一区二区三区视频| 日韩在线卡一卡二| 亚洲精品自拍视频在线观看| 91精品欧美久久久久久动漫 | 青青草国产免费一区二区下载| 牛夜精品久久久久久久| 自拍视频在线观看一区二区| 亚洲第一视频在线| 欧美亚洲在线视频| 日本成人小视频| www.日本久久| 免费国产亚洲视频| 一区二区免费电影| 日韩精品一级二级| 精品无码久久久久成人漫画| 精品久久久久久久久久久久久久久| 极品美鲍一区| 亚洲草草视频| 国产精品一区久久久久| 中文字幕亚洲高清| 中文字幕国产精品| 日韩激情欧美| 成人午夜视频免费在线观看| 亚洲婷婷综合色高清在线| 国产 日韩 欧美 精品| 国产精品igao视频| 亚洲色图二区| 日韩乱码人妻无码中文字幕久久| 7777女厕盗摄久久久| 91精品国产黑色瑜伽裤| 视频一区在线免费观看| 国产成人精品综合在线观看| 日韩久久中文字幕| 毛片精品免费在线观看| 国产99久久| 老司机av网站| 欧美熟乱第一页| 爱啪啪综合导航| ijzzijzzij亚洲大全|