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

檢測iOS的APP 性能的一些方法

移動開發(fā) iOS
首先如果遇到應(yīng)用卡頓或者因?yàn)閮?nèi)存占用過多時(shí)一般使用Instruments里的來進(jìn)行檢測。但對于復(fù)雜情況可能就需要用到子線程監(jiān)控主線程的方式來了,下面我對這些方法做些介紹。

[[183880]]

首先如果遇到應(yīng)用卡頓或者因?yàn)閮?nèi)存占用過多時(shí)一般使用Instruments里的來進(jìn)行檢測。但對于復(fù)雜情況可能就需要用到子線程監(jiān)控主線程的方式來了,下面我對這些方法做些介紹:

Time Profiler

可以查看多個(gè)線程里那些方法費(fèi)時(shí)過多的方法。先將右側(cè)Hide System Libraries打上勾,這樣能夠過濾信息。然后在Call Tree上會默認(rèn)按照費(fèi)時(shí)的線程進(jìn)行排序,單個(gè)線程中會也會按照對應(yīng)的費(fèi)時(shí)方法排序,選擇方法后能夠通過右側(cè)Heaviest Stack Trace里雙擊查看到具體的費(fèi)時(shí)操作代碼,從而能夠有針對性的優(yōu)化,而不需要在一些本來就不會怎么影響性能的地方過度優(yōu)化。

Allocations

這里可以對每個(gè)動作的前后進(jìn)行Generations,對比內(nèi)存的增加,查看使內(nèi)存增加的具體的方法和代碼所在位置。具體操作是在右側(cè)Generation Analysis里點(diǎn)擊Mark Generation,這樣會產(chǎn)生一個(gè)Generation,切換到其他頁面或一段時(shí)間產(chǎn)生了另外一個(gè)事件時(shí)再點(diǎn)Mark Generation來產(chǎn)生一個(gè)新的Generation,這樣反復(fù),生成多個(gè)Generation,查看這幾個(gè)Generation會看到Growth的大小,如果太大可以點(diǎn)進(jìn)去查看相應(yīng)占用較大的線程里右側(cè)Heaviest Stack Trace里查看對應(yīng)的代碼塊,然后進(jìn)行相應(yīng)的處理。

Leak

可以在上面區(qū)域的Leaks部分看到對應(yīng)的時(shí)間點(diǎn)產(chǎn)生的溢出,選擇后在下面區(qū)域的Statistics>Allocation Summary能夠看到泄漏的對象,同樣可以通過Stack Trace查看到具體對應(yīng)的代碼區(qū)域。

開發(fā)時(shí)需要注意如何避免一些性能問題

NSDateFormatter

通過Instruments的檢測會發(fā)現(xiàn)創(chuàng)建NSDateFormatter或者設(shè)置NSDateFormatter的屬性的耗時(shí)總是排在前面,如何處理這個(gè)問題呢,比較推薦的是添加屬性或者創(chuàng)建靜態(tài)變量,這樣能夠使得創(chuàng)建初始化這個(gè)次數(shù)降到***。還有就是可以直接用C,或者這個(gè)NSData的Category來解決https://github.com/samsoffes/sstoolkit/blob/master/SSToolkit/NSData%2BSSToolkitAdditions.m

UIImage

這里要主要是會影響內(nèi)存的開銷,需要權(quán)衡下imagedNamed和imageWithContentsOfFile,了解兩者特性后,在只需要顯示一次的圖片用后者,這樣會減少內(nèi)存的消耗,但是頁面顯示會增加Image IO的消耗,這個(gè)需要注意下。由于imageWithContentsOfFile不緩存,所以需要在每次頁面顯示前加載一次,這個(gè)IO的操作也是需要考慮權(quán)衡的一個(gè)點(diǎn)。

頁面加載

如果一個(gè)頁面內(nèi)容過多,view過多,這樣將長頁面中的需要滾動才能看到的那個(gè)部分視圖內(nèi)容通過開啟新的線程同步的加載。

優(yōu)化***加載時(shí)間

通過Time Profier可以查看到啟動所占用的時(shí)間,如果太長可以通過Heaviest Stack Trace找到費(fèi)時(shí)的方法進(jìn)行改造。

監(jiān)控卡頓的方法

還有種方法是在程序里去監(jiān)控性能問題。可以先看看這個(gè)Demo,地址https://github.com/ming1016/DecoupleDemo。 這樣在上線后可以通過這個(gè)程序?qū)⒂脩舻目D操作記錄下來,定時(shí)發(fā)到自己的服務(wù)器上,這樣能夠更大范圍的收集性能問題。眾所周知,用戶層面感知的卡頓都是來自處理所有UI的主線程上,包括在主線程上進(jìn)行的大計(jì)算,大量的IO操作,或者比較重的繪制工作。如何監(jiān)控主線程呢,首先需要知道的是主線程和其它線程一樣都是靠NSRunLoop來驅(qū)動的??梢韵瓤纯碈FRunLoopRun的大概的邏輯

 

  1. int32_t __CFRunLoopRun() 
  2.  
  3.  
  4.     __CFRunLoopDoObservers(KCFRunLoopEntry); 
  5.  
  6.     do 
  7.  
  8.     { 
  9.  
  10.         __CFRunLoopDoObservers(kCFRunLoopBeforeTimers); 
  11.  
  12.         __CFRunLoopDoObservers(kCFRunLoopBeforeSources); //這里開始到kCFRunLoopBeforeWaiting之間處理時(shí)間是感知卡頓的關(guān)鍵地方 
  13.  
  14.   
  15.  
  16.         __CFRunLoopDoBlocks(); 
  17.  
  18.         __CFRunLoopDoSource0(); //處理UI事件 
  19.  
  20.   
  21.  
  22.         //GCD dispatch main queue 
  23.  
  24.         CheckIfExistMessagesInMainDispatchQueue(); 
  25.  
  26.   
  27.  
  28.         //休眠前 
  29.  
  30.         __CFRunLoopDoObservers(kCFRunLoopBeforeWaiting); 
  31.  
  32.   
  33.  
  34.         //等待msg 
  35.  
  36.         mach_port_t wakeUpPort = SleepAndWaitForWakingUpPorts(); 
  37.  
  38.   
  39.  
  40.         //等待中 
  41.  
  42.   
  43.  
  44.         //休眠后,喚醒 
  45.  
  46.         __CFRunLoopDoObservers(kCFRunLoopAfterWaiting); 
  47.  
  48.   
  49.  
  50.         //定時(shí)器喚醒 
  51.  
  52.         if (wakeUpPort == timerPort) 
  53.  
  54.             __CFRunLoopDoTimers(); 
  55.  
  56.   
  57.  
  58.         //異步處理 
  59.  
  60.         else if (wakeUpPort == mainDispatchQueuePort) 
  61.  
  62.             __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__() 
  63.  
  64.   
  65.  
  66.         //UI,動畫 
  67.  
  68.         else 
  69.  
  70.             __CFRunLoopDoSource1(); 
  71.  
  72.   
  73.  
  74.         //確保同步 
  75.  
  76.         __CFRunLoopDoBlocks(); 
  77.  
  78.   
  79.  
  80.     } while (!stop && !timeout); 
  81.  
  82.   
  83.  
  84.     //退出RunLoop 
  85.  
  86.     __CFRunLoopDoObservers(CFRunLoopExit); 
  87.  

 

根據(jù)這個(gè)RunLoop我們能夠通過CFRunLoopObserverRef來度量。用GCD里的dispatch_semaphore_t開啟一個(gè)新線程,設(shè)置一個(gè)極限值和出現(xiàn)次數(shù)的值,然后獲取主線程上在kCFRunLoopBeforeSources到kCFRunLoopBeforeWaiting再到kCFRunLoopAfterWaiting兩個(gè)狀態(tài)之間的超過了極限值和出現(xiàn)次數(shù)的場景,將堆棧dump下來,***發(fā)到服務(wù)器做收集,通過堆棧能夠找到對應(yīng)出問題的那個(gè)方法。

  1. static void runLoopObserverCallBack(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info) 
  2.  
  3.  
  4.     MyClass *object = (__bridge MyClass*)info; 
  5.  
  6.     object->activity = activity; 
  7.  
  8.  
  9.   
  10.  
  11. static void runLoopObserverCallBack(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info){ 
  12.  
  13.     SMLagMonitor *lagMonitor = (__bridge SMLagMonitor*)info; 
  14.  
  15.     lagMonitor->runLoopActivity = activity; 
  16.  
  17.   
  18.  
  19.     dispatch_semaphore_t semaphore = lagMonitor->dispatchSemaphore; 
  20.  
  21.     dispatch_semaphore_signal(semaphore); 
  22.  
  23.  
  24.   
  25.  
  26. - (void)endMonitor { 
  27.  
  28.     if (!runLoopObserver) { 
  29.  
  30.         return
  31.  
  32.     } 
  33.  
  34.     CFRunLoopRemoveObserver(CFRunLoopGetMain(), runLoopObserver, kCFRunLoopCommonModes); 
  35.  
  36.     CFRelease(runLoopObserver); 
  37.  
  38.     runLoopObserver = NULL
  39.  
  40.  
  41.   
  42.  
  43. - (void)beginMonitor { 
  44.  
  45.     if (runLoopObserver) { 
  46.  
  47.         return
  48.  
  49.     } 
  50.  
  51.     dispatchSemaphore = dispatch_semaphore_create(0); //Dispatch Semaphore保證同步 
  52.  
  53.     //創(chuàng)建一個(gè)觀察者 
  54.  
  55.     CFRunLoopObserverContext context = {0,(__bridge void*)self,NULL,NULL}; 
  56.  
  57.     runLoopObserver = CFRunLoopObserverCreate(kCFAllocatorDefault, 
  58.  
  59.                                               kCFRunLoopAllActivities, 
  60.  
  61.                                               YES, 
  62.  
  63.                                               0, 
  64.  
  65.                                               &runLoopObserverCallBack, 
  66.  
  67.                                               &context); 
  68.  
  69.     //將觀察者添加到主線程runloop的common模式下的觀察中 
  70.  
  71.     CFRunLoopAddObserver(CFRunLoopGetMain(), runLoopObserver, kCFRunLoopCommonModes); 
  72.  
  73.   
  74.  
  75.     //創(chuàng)建子線程監(jiān)控 
  76.  
  77.     dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
  78.  
  79.         //子線程開啟一個(gè)持續(xù)的loop用來進(jìn)行監(jiān)控 
  80.  
  81.         while (YES) { 
  82.  
  83.             long semaphoreWait = dispatch_semaphore_wait(dispatchSemaphore, dispatch_time(DISPATCH_TIME_NOW, 30*NSEC_PER_MSEC)); 
  84.  
  85.             if (semaphoreWait != 0) { 
  86.  
  87.                 if (!runLoopObserver) { 
  88.  
  89.                     timeoutCount = 0; 
  90.  
  91.                     dispatchSemaphore = 0; 
  92.  
  93.                     runLoopActivity = 0; 
  94.  
  95.                     return
  96.  
  97.                 } 
  98.  
  99.                 //兩個(gè)runloop的狀態(tài),BeforeSources和AfterWaiting這兩個(gè)狀態(tài)區(qū)間時(shí)間能夠檢測到是否卡頓 
  100.  
  101.                 if (runLoopActivity == kCFRunLoopBeforeSources || runLoopActivity == kCFRunLoopAfterWaiting) { 
  102.  
  103.                     //出現(xiàn)三次出結(jié)果 
  104.  
  105.                     if (++timeoutCount 3) { 
  106.  
  107.                         continue
  108.  
  109.                     } 
  110.  
  111.   
  112.  
  113.                     //將堆棧信息上報(bào)服務(wù)器的代碼放到這里 
  114.  
  115.   
  116.  
  117.                 } //end activity 
  118.  
  119.             }// end semaphore wait 
  120.  
  121.             timeoutCount = 0; 
  122.  
  123.         }// end while 
  124.  
  125.     }); 
  126.  
  127.   
  128.  

 

有時(shí)候造成卡頓是因?yàn)閿?shù)據(jù)異常,過多,或者過大造成的,亦或者是操作的異常出現(xiàn)的,這樣的情況可能在平時(shí)日常開發(fā)測試中難以遇到,但是在真實(shí)的特別是用戶受眾廣的情況下會有人出現(xiàn),這樣這種收集卡頓的方式還是有價(jià)值的。

堆棧dump的方法

***種是直接調(diào)用系統(tǒng)函數(shù)獲取棧信息,這種方法只能夠獲得簡單的信息,沒法配合dSYM獲得具體哪行代碼出了問題,類型也有限。這種方法的主要思路是signal進(jìn)行錯誤信號的獲取。代碼如下

  1. static int s_fatal_signals[] = { 
  2.  
  3.     SIGABRT, 
  4.  
  5.     SIGBUS, 
  6.  
  7.     SIGFPE, 
  8.  
  9.     SIGILL, 
  10.  
  11.     SIGSEGV, 
  12.  
  13.     SIGTRAP, 
  14.  
  15.     SIGTERM, 
  16.  
  17.     SIGKILL, 
  18.  
  19. }; 
  20.  
  21.   
  22.  
  23. static int s_fatal_signal_num = sizeof(s_fatal_signals) / sizeof(s_fatal_signals[0]); 
  24.  
  25.   
  26.  
  27. void UncaughtExceptionHandler(NSException *exception) { 
  28.  
  29.     NSArray *exceptionArray = [exception callStackSymbols]; //得到當(dāng)前調(diào)用棧信息 
  30.  
  31.     NSString *exceptionReason = [exception reason];       //非常重要,就是崩潰的原因 
  32.  
  33.     NSString *exceptionName = [exception name];           //異常類型 
  34.  
  35.  
  36.   
  37.  
  38. void SignalHandler(int code) 
  39.  
  40.  
  41.     NSLog(@"signal handler = %d",code); 
  42.  
  43.  
  44.   
  45.  
  46. void InitCrashReport() 
  47.  
  48.  
  49.     //系統(tǒng)錯誤信號捕獲 
  50.  
  51.     for (int i = 0; i signal(s_fatal_signals[i], SignalHandler); 
  52.  
  53.     } 
  54.  
  55.   
  56.  
  57.     //oc未捕獲異常的捕獲 
  58.  
  59.     NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler); 
  60.  
  61.  
  62. int main(int argc, char * argv[]) { 
  63.  
  64.     @autoreleasepool { 
  65.  
  66.         InitCrashReport(); 
  67.  
  68.         return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
  69.  
  70.     } 
  71.  

 

使用PLCrashReporter的話出的報(bào)告看起來能夠定位到問題代碼的具體位置了。

  1. NSData *lagData = [[[PLCrashReporter alloc] 
  2.  
  3.                                           initWithConfiguration:[[PLCrashReporterConfig alloc] initWithSignalHandlerType:PLCrashReporterSignalHandlerTypeBSD symbolicationStrategy:PLCrashReporterSymbolicationStrategyAll]] generateLiveReport]; 
  4.  
  5. PLCrashReport *lagReport = [[PLCrashReport alloc] initWithData:lagData error:NULL]; 
  6.  
  7. NSString *lagReportString = [PLCrashReportTextFormatter stringValueForCrashReport:lagReport withTextFormat:PLCrashReportTextFormatiOS]; 
  8.  
  9. //將字符串上傳服務(wù)器 
  10.  
  11. NSLog(@"lag happen, detail below: 
  12.  
  13. %@",lagReportString); 

 

測試Demo里堆棧中的內(nèi)容,超過了微信正文字?jǐn)?shù),所以本文省略了 

責(zé)任編輯:龐桂玉 來源: iOS大全
相關(guān)推薦

2019-09-17 09:21:01

2018-06-14 09:35:35

2012-08-22 13:00:08

2009-06-18 13:42:48

Hibernate s

2015-03-16 10:00:40

iOSARCMRC

2021-06-10 10:02:19

優(yōu)化緩存性能

2011-03-11 09:27:11

Java性能監(jiān)控

2015-07-28 14:39:02

IOS技巧

2018-02-06 11:10:27

iOS開發(fā)Xcode快捷鍵

2013-08-27 13:24:46

App Store應(yīng)用上傳應(yīng)用截圖ASO應(yīng)用商店優(yōu)化

2012-06-15 09:41:40

Linux內(nèi)核

2011-08-31 10:54:25

Java性能

2023-09-04 16:55:18

2017-05-10 14:49:52

Kotlin語言Java

2021-04-19 17:25:08

Kubernetes組件網(wǎng)絡(luò)

2012-12-24 14:51:02

iOS

2018-02-04 22:29:21

iOS開發(fā)

2015-07-28 14:52:35

IOS技巧

2014-05-13 09:55:13

iOS開發(fā)工具

2009-08-27 10:06:15

Scala的構(gòu)造方法
點(diǎn)贊
收藏

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

97在线免费公开视频| 国产98在线|日韩| 欧美福利第一页| 国产第一亚洲| 亚洲综合无码一区二区| 国产欧美日本在线| 日韩国产成人在线| 亚洲情侣在线| 亚洲乱码国产乱码精品精| 亚洲最大综合网| 超免费在线视频| 国产女人aaa级久久久级 | 国产成人精品www牛牛影视| 午夜精品一区二区三区视频免费看 | 佐佐木明希av| 欧洲毛片在线| 国产综合色精品一区二区三区| 97色在线视频| 日韩在线视频网址| 国产一区二区三区四区五区| 欧美一区二区三区的| 无码精品a∨在线观看中文| 国产在线激情视频| 国产日韩一级二级三级| 国新精品乱码一区二区三区18| 中文字幕人妻色偷偷久久| 在线 亚洲欧美在线综合一区| 中文字幕成人精品久久不卡 | 香蕉久久夜色精品国产更新时间| 91精品国产综合久久精品性色| 国产aaa一级片| f2c人成在线观看免费视频| 亚洲欧洲国产专区| 亚州欧美一区三区三区在线| 香蕉国产在线视频| 懂色av中文一区二区三区| 国产一区二区在线播放| 日韩精品一区不卡| 国产精品丝袜xxxxxxx| 久久99亚洲热视| 麻豆视频在线免费看| 操欧美老女人| 国产一区二区三区久久精品| 搡老熟女老女人一区二区| 激情视频极品美女日韩| 日韩一级免费观看| 激情图片中文字幕| 亚洲国产天堂| 欧美精品久久99久久在免费线| 天天操天天爱天天爽| 欧美理论影院| 欧美亚洲高清一区二区三区不卡| 亚洲精品乱码久久久久久自慰| 日本在线啊啊| 色诱视频网站一区| 韩国日本在线视频| 欧美特黄aaaaaaaa大片| 欧美性videos高清精品| 黄色片视频在线免费观看| 欧美激情成人动漫| 呻吟揉丰满对白91乃国产区| 国产亚洲一区二区三区不卡| 亚洲欧洲激情在线| 免费看黄色av| 亚洲一区二区| 欧美激情视频免费观看| 成人444kkkk在线观看| 欧美日韩激情四射| 大片免费在线看视频| 自拍偷拍欧美激情| 91嫩草国产丨精品入口麻豆| 2024最新电影在线免费观看| 亚洲永久精品大片| 777av视频| 欲香欲色天天天综合和网| 色一情一伦一子一伦一区| 日韩欧美黄色大片| 亚洲在线资源| 亚洲精品在线观看网站| 搡老熟女老女人一区二区| 深爱激情综合| 俺去了亚洲欧美日韩| 麻豆影视在线播放| 国产精品美女| 国产精品美女www爽爽爽视频| 在线视频你懂得| 国产成人精品免费| 蜜桃狠狠色伊人亚洲综合网站| 国产一二三在线观看| 国产精品乱码久久久久久| 国产欧美自拍视频| 麻豆视频在线观看免费网站黄| 在线视频综合导航| 在线观看免费看片| 西野翔中文久久精品国产| 中文字幕亚洲欧美日韩高清| 久久高清内射无套| 一区二区三区成人精品| 国产mv免费观看入口亚洲| 国产女人爽到高潮a毛片| 成人成人成人在线视频| 日韩av不卡播放| xvideos国产在线视频| 性做久久久久久免费观看 | 视频在线观看一区| 成人中心免费视频| 午夜国产在线视频| 国产精品福利一区| 日韩中文字幕在线免费| 成人国产一区| 精品国产凹凸成av人网站| 欧美激情久久久久久久| 亚洲精品1区2区| 国产精品一区二区久久| 亚洲色图21p| |精品福利一区二区三区| 日本手机在线视频| 欧美成人高清视频在线观看| 亚洲精品久久在线| 国产一二三区精品| 日本网站在线观看一区二区三区| 国产成人精品自拍| 国内精品久久久久久野外| 色视频成人在线观看免| 久久福利小视频| 午夜久久美女| 成人性教育视频在线观看| 想看黄色一级片| 亚洲av成人精品日韩在线播放| 国产精品二三区| 国产情侣av自拍| 欧美综合自拍| 韩国精品久久久999| www.看毛片| 亚洲色图20p| 三级av免费观看| 精品视频国产| 国产成人精品电影久久久| 无码精品人妻一区二区三区影院| 一区二区三区欧美视频| 午夜视频在线观| 91精品国产自产拍在线观看蜜| 国产美女久久精品香蕉69| 国产一二三在线观看| 91福利社在线观看| 欧美特黄一区二区三区| 国产日韩欧美在线播放不卡| 国产精品一区在线播放| 欧洲一区二区三区| 欧美成人性福生活免费看| 国产老头老太做爰视频| 国模无码大尺度一区二区三区| 一区二区精品国产| 欧洲亚洲精品久久久久| 色偷偷噜噜噜亚洲男人| 97国产精品久久久| 亚洲图片欧美激情| 久久久久久久久久毛片| 欧美成人一品| 国产精品xxxx| 亚洲欧美电影| 国产午夜精品美女视频明星a级| 亚洲婷婷久久综合| 国产精品久久久久影院色老大| 91女神在线观看| 亚洲第一偷拍| 99国精产品一二二线| av日韩国产| 日韩激情视频在线| 日韩免费av网站| 国产精品女主播av| 伊人免费视频二| 激情婷婷久久| 欧美日韩三区四区| 免费成人黄色网| 不卡伊人av在线播放| 亚洲国产日韩在线观看| 天天色图综合网| 国产传媒国产传媒| 国产一区二区视频在线播放| 国产黄色激情视频| 免费看成人哺乳视频网站| 国产精品日韩av| 中文av资源在线| 亚洲精品成人久久久| 国产成人av免费| 亚洲蜜臀av乱码久久精品| 黄色av电影网站| 久久视频一区| 亚洲av首页在线| 色吊丝一区二区| 国产日韩欧美日韩大片| 超免费在线视频| 中文字幕在线视频日韩| 亚洲精品中文字幕成人片 | 日韩中文字幕高清| 亚洲老司机在线| 精品无码一区二区三区| 精品一区二区三区免费视频| 全黄性性激高免费视频| 日韩中文首页| 精品国产91亚洲一区二区三区www| 91久久久久久白丝白浆欲热蜜臀| 欧美风情在线观看| 成人高清在线| 亚洲国产精品va在线看黑人| 亚洲天堂男人网| 福利一区视频在线观看| 欧美特级一级片| 国产亚洲一二三区| 欧美成人精品一区二区综合免费| 日本亚洲天堂网| 人妻熟妇乱又伦精品视频| 亚欧美无遮挡hd高清在线视频| 久久久久高清| 日韩精品视频在线看| 国产精品久久久久久久电影 | 亚洲大片免费看| 韩国一级黄色录像| 久久久久久久久久久久久夜| 91人妻一区二区| 国产精品中文有码| 香港日本韩国三级网站| 亚洲综合社区| 男人天堂手机在线视频| 午夜精品久久久久久久四虎美女版| 美女主播视频一区| 开心激情综合| 国产精品视频福利| 日韩高清在线电影| 蜜臀av色欲a片无码精品一区| 成人在线电影在线观看视频| 久久99精品久久久久久久久久| 日韩一区二区三区精品| 国产欧美亚洲视频| 日韩毛片在线| 国产精品福利在线观看| 成人av三级| 91黑丝在线观看| 国产伦子伦对白在线播放观看| 欧美黄色片在线观看| av官网在线播放| 欧美猛男做受videos| 亚洲精品日产aⅴ| 日韩欧乱色一区二区三区在线 | 精品亚洲一区二区三区在线观看| 国产综合视频在线| 精品久久国产老人久久综合| 精品国产一级片| 日韩一二在线观看| www.av导航| 精品免费视频一区二区| 亚洲精品国产片| 精品国产99国产精品| 日日躁夜夜躁白天躁晚上躁91| 亚洲成人aaa| 色猫av在线| 亚洲午夜色婷婷在线| 成人午夜电影在线观看| 色99之美女主播在线视频| 日本免费在线视频| 久久视频在线直播| 婷婷在线播放| 午夜精品一区二区三区在线播放| 涩涩涩在线视频| 国产精品爽黄69天堂a| 成人影视免费观看| 欧美一级视频| 日韩一级片播放| 久久99久久精品| 亚洲精品久久久久久| 成人97人人超碰人人99| 日本黄色网址大全| 国产精品久久久一本精品 | 欧美久久久久久久久久久| 不卡视频一二三| 亚洲第一成人网站| 国产精品美女视频| 欧美久久久久久久久久久久| 午夜av电影一区| 伊人久久久久久久久久久久| 7777精品伊人久久久大香线蕉经典版下载| 99精品免费观看| 日韩精品极品在线观看播放免费视频 | 日韩欧美精品一区二区三区| 国产精品第10页| 欧美特黄不卡| 欧美精品一区二区三区四区五区| 日韩久久视频| 欧美一级片免费播放| 人人爽香蕉精品| 久久久久无码国产精品一区李宗瑞| 久久综合久色欧美综合狠狠| 91麻豆精品久久毛片一级| 亚洲一区二区三区四区在线| 这里只有精品999| 精品国产乱码久久久久久影片| 黄色美女网站在线观看| 久久国产精品久久久久久久久久| 日韩精品av| 91文字幕巨乱亚洲香蕉| 视频一区在线观看| 成人在线视频一区二区三区| 日本成人在线一区| 国产麻豆剧传媒精品国产av| 中文字幕日本不卡| 天天干,天天干| 亚洲国产精品va在线| dj大片免费在线观看| 国产v综合v亚洲欧美久久| 国产美女撒尿一区二区| 一区二区三区三区在线| 鲁大师成人一区二区三区| 激情小说欧美色图| 中文字幕亚洲一区二区va在线| 可以免费在线观看的av| 日韩三级电影网址| 午夜在线视频| 日韩美女在线观看一区| 精品国产导航| 成人国产在线看| 九九国产精品视频| 成年人在线免费看片| 黑人巨大精品欧美一区二区免费| av无码精品一区二区三区宅噜噜| 国产一区二区av| 在线观看涩涩| 国产一区二区三区免费不卡| 欧美jizzhd精品欧美巨大免费| 一本久道综合色婷婷五月| 91一区二区在线观看| 国产精品成人免费一区二区视频| 欧美一级午夜免费电影| 日本在线天堂| 国产精品久久久久91| 国产精品嫩草影院在线看| 欧美在线观看www| 99精品视频在线播放观看| 久久久久无码国产精品| 日韩欧美电影一二三| 91小视频xxxx网站在线| 91免费电影网站| 亚洲激情五月| 黄色一级片免费播放| 亚洲女厕所小便bbb| 97免费观看视频| 久热在线中文字幕色999舞| 亚洲一区二区av| 久久精品在线免费视频| 国产一区二区不卡在线| 男人与禽猛交狂配| 日韩欧美一区二区不卡| 丝袜在线观看| 国产亚洲一区二区三区在线播放| 在线日韩视频| 欧美图片一区二区| 在线视频一区二区三区| 一级毛片视频在线| 91探花福利精品国产自产在线| 911精品美国片911久久久| 国产成人av免费观看| 亚洲美女一区二区三区| 精品人妻少妇嫩草av无码专区 | 亚洲精品影院| 国内精品久久久久影院薰衣草| 波多野结衣不卡视频| 亚洲第一国产精品| 范冰冰一级做a爰片久久毛片| 日韩精品无码一区二区三区| 精品一区二区久久| 久久一二三四区| 亚洲精品一区av在线播放| 国产一区二区三区四区五区3d| 黄色高清视频网站| 成人黄色综合网站| 无码免费一区二区三区| www亚洲欧美| 国产精品久av福利在线观看| 欧美激情国产精品日韩| 国产精品国产精品国产专区不片| www.xxx国产| 国产精品91视频| 欧美a级片一区| 丰满少妇一区二区| 8x福利精品第一导航| jizzjizz中国精品麻豆| 色女人综合av| 成人亚洲一区二区一| 精品成人无码久久久久久| 美日韩精品免费观看视频| 亚洲+小说+欧美+激情+另类 | 91麻豆精品一二三区在线| aa在线观看视频| 中文字幕一区二区三区精华液| 成人免费视频国产| 国产精品视频在线播放| 亚洲精品一二| 91久久久久久久久久久久久久| 日韩成人久久久| 91成人app|