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

iOS面試題·項(xiàng)目中用過 Runtime 嗎?

移動(dòng)開發(fā)
我們知道靜態(tài)語言在編譯時(shí)期,就已經(jīng)確定了函數(shù)的具體調(diào)用,而動(dòng)態(tài)語言要等到運(yùn)行時(shí)期才能真正確定調(diào)用哪個(gè)函數(shù); Objective-C 是一門動(dòng)態(tài)語言,它是通過 Runtime 這個(gè)運(yùn)行時(shí)機(jī)制來實(shí)現(xiàn)的。

前言

我們知道靜態(tài)語言在編譯時(shí)期,就已經(jīng)確定了函數(shù)的具體調(diào)用,而動(dòng)態(tài)語言要等到運(yùn)行時(shí)期才能真正確定調(diào)用哪個(gè)函數(shù); Objective-C 是一門動(dòng)態(tài)語言,它是通過 Runtime 這個(gè)運(yùn)行時(shí)機(jī)制來實(shí)現(xiàn)的。

[[248751]]

雖然說 Runtime 是相對于底層的機(jī)制,但是在項(xiàng)目過程中也經(jīng)常用來解決一些問題。下面我們就來看看利用 Runtime 可以解決項(xiàng)目中什么問題。

項(xiàng)目中用 Runtime 實(shí)現(xiàn)的功能

利用關(guān)聯(lián)對象為分類增加偽屬性

在項(xiàng)目的開發(fā)中,經(jīng)常會(huì)遇到要為已經(jīng)存在的類添加屬性。面對這種情況,我們一般都是創(chuàng)建一個(gè)分類,來實(shí)現(xiàn)為已有的類增加屬性,但是由于分類結(jié)構(gòu)的特殊性,在分類添加屬性,并不會(huì)為我們自動(dòng)創(chuàng)建實(shí)例變量和存儲(chǔ)方法。

首先我們要知道,常規(guī)定義一個(gè) @property,其實(shí)編譯器會(huì)為我們做三件事情:

  • 生成實(shí)例變量 _property
  • 生成 getter 方法
  • 生成 setter 方法

但是,在分類中并不會(huì)幫我們?nèi)ド蓪?shí)例變量和存取方法,所以我們需要自己去實(shí)現(xiàn)存取方法,這里我們會(huì)通過關(guān)聯(lián)對象去將鍵值關(guān)聯(lián)到對象上面去,以下是代碼示例: 

  1. @property (nonatomic, strong) NSString *title; 
  2.  
  3. - (NSString *)title { 
  4.     return objc_getAssociatedObject(self, _cmd); 
  5.  
  6. - (void)setTitle:(NSString *)title { 
  7.     objc_setAssociatedObject(self, @selector(title), title, OBJC_ASSOCIATION_RETAIN); 

這個(gè)我們暫時(shí)只講如何通過關(guān)聯(lián)對象為分類增加偽屬性,至于分類為什么不會(huì)為我們自動(dòng)添加實(shí)例變量和存取方法,以及關(guān)聯(lián)對象的實(shí)現(xiàn)原理等,我們會(huì)在后面的面試題繼續(xù)涉及到這一話題。

利用 Method Swizzling 交換方法

我們可以用 Method Swizzling 來交換兩個(gè)方法的實(shí)現(xiàn),以便達(dá)到 Hook 的效果;例如交換 ViewController 生命周期方法來實(shí)現(xiàn)頁面埋點(diǎn),或者在不影響原有的功能增加一些特殊的功能。

交換方法主要是利用到 Runtime 中的class_addMethod 、class_replaceMethod、method_exchangeImplementations 方法來實(shí)現(xiàn)的,以下是 Method Swizzling 代碼示例: 

  1. /** 
  2.  交換方法 
  3.  */ 
  4. + (void)pxy_swizzleMethodWithOriginalSelector:(SEL)originalSelector swizzledSelector:(SEL)swizzledSelector { 
  5.     Class class = [self class]; 
  6.  
  7.     SEL originalSeletor = originalSelector; 
  8.     SEL swizzledSeletor = swizzledSelector; 
  9.  
  10.     Method originMethod = class_getInstanceMethod(class, originalSeletor); 
  11.     Method swizzledMethod = class_getInstanceMethod(class, swizzledSeletor); 
  12.  
  13.     //先嘗試給源SEL添加IMP,這里是為了避免源SEL沒有實(shí)現(xiàn)IMP的情況 
  14.     BOOL didAddMethod = class_addMethod(class, originalSeletor, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); 
  15.     if (didAddMethod) { 
  16.         //添加成功:說明源SEL沒有實(shí)現(xiàn)IMP,將源SEL的IMP替換到交換SEL的IMP 
  17.         class_replaceMethod(class, swizzledSeletor, method_getImplementation(originMethod), method_getTypeEncoding(originMethod)); 
  18.     } else { 
  19.         //添加失敗:說明源SEL已經(jīng)有IMP,直接將兩個(gè)SEL的IMP交換即可 
  20.         method_exchangeImplementations(originMethod, swizzledMethod); 
  21.     } 

利用 class_copyIvarList 實(shí)現(xiàn) NSCoding 的自動(dòng)歸檔解檔

在利用 NSKeyedArchiver 歸檔解檔對象的時(shí)候,對象 Model 需要實(shí)現(xiàn) NSCoding 協(xié)議,并且要實(shí)現(xiàn) encodeWithCoder、initWithCoder 兩個(gè)方法,在這兩個(gè)方法中要為每個(gè)屬性進(jìn)行 code 和 encode,不然就會(huì) crash。

在項(xiàng)目開發(fā)過程中,經(jīng)常會(huì)出現(xiàn) Model 中的屬性會(huì)變更,這個(gè)時(shí)候總是會(huì)忘記去修改對應(yīng)的屬性 code 和 encode,這里就會(huì)導(dǎo)致 crash;為了避免這個(gè)現(xiàn)象和讓 Model 中的方法更加簡潔可控,這里我們會(huì)利用 class_copyIvarList 來獲取對象中的成員變量列表,然后利用 KVC 來 code 和 encode。實(shí)例代碼如下:(這里我們將這個(gè)通用的代碼抽象成宏,這樣子在需要的 Model 中直接調(diào)用就可以了) 

  1. #define PXYNSCodingRuntime_EncodeWithCoder(Class) \ 
  2. unsigned int outCount = 0;\ 
  3. Ivar *ivars = class_copyIvarList([Class class], &outCount);\ 
  4. for (int i = 0; i < outCount; i++) {\ 
  5.     Ivar ivar = ivars[i];\ 
  6.     NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];\ 
  7.     [aCoder encodeObject:[self valueForKey:key] forKey:key];\ 
  8. }\ 
  9. free(ivars);\ 
  10.  
  11. #define PXYNSCodingRuntime_InitWithCoder(Class)\ 
  12. if (self = [super init]) {\ 
  13.     unsigned int outCount = 0;\ 
  14.     Ivar *ivars = class_copyIvarList([Class class], &outCount);\ 
  15.     for (int i = 0; i < outCount; i++) {\ 
  16.         Ivar ivar = ivars[i];\ 
  17.         NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];\ 
  18.         id value = [aDecoder decodeObjectForKey:key];\ 
  19.         if (value) {\ 
  20.             [self setValue:value forKey:key];\ 
  21.         }\ 
  22.     }\ 
  23.     free(ivars);\ 
  24. }\ 
  25. return self;\ 
  26.  
  27. // 對應(yīng)調(diào)用 
  28. - (void)encodeWithCoder:(NSCoder *)aCoder { 
  29.     PXYNSCodingRuntime_EncodeWithCoder(Father) 
  30. - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { 
  31.     PXYNSCodingRuntime_InitWithCoder(Father) 

利用 objc_allocateClassPair、object_setClass 等 API 來實(shí)現(xiàn) KVO Block

在項(xiàng)目中,會(huì)經(jīng)常使用 KVO 來監(jiān)聽某個(gè)屬性的變化。先給出系統(tǒng)調(diào)用的方式,添加監(jiān)聽后,在 observeValueForKeyPath 方法中處理變化: 

  1. - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context; 
  2.  
  3.  - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context { 
  4.  NSLog(@"%@ 對象的 %@ 屬性改變了:%@",object,keyPath,change); 
  5.  } 

但是在開發(fā)過程中,有時(shí)候想將代碼增加內(nèi)聚性和在 observeValueForKeyPath 減少判斷,我們可以通過 Runtime 來實(shí)現(xiàn)一個(gè) KVO Block,這樣調(diào)用地方即處理消息的地方,代碼上比較直觀,簡單 API 如下: 

  1. typedef void(^PXYKVOCompleteBlock)(id observer, NSString *keyPath, id oldValue, id newValue); 
  2.  
  3. /** 
  4.  添加 KVO Block 
  5.  */ 
  6. - (void)pxy_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath completeBlock:(PXYKVOCompleteBlock)completeBlock; 
  7.  
  8. /** 
  9.  移除 KVO Block 
  10.  */ 
  11. - (void)pxy_removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath; 

KVO 主要是動(dòng)態(tài)派生出一個(gè)中間類,然后在這個(gè)中間類處理相關(guān)通知邏輯,具體代碼可以 Demo 中的 NSObject+PXYKVO 具體實(shí)現(xiàn);

利用消息轉(zhuǎn)發(fā)機(jī)制實(shí)現(xiàn)多播委托(蹦床模式)

首先,在對象收到無法處理的消息之后,會(huì)執(zhí)行消息轉(zhuǎn)發(fā),消息轉(zhuǎn)發(fā)有三個(gè)步驟:

  • 調(diào)用 resolveInstanceMethod 方法。動(dòng)態(tài)方法解析,這里會(huì)給類使用 class_addMethod 來增加方法的機(jī)會(huì)。
  • 調(diào)用 forwardingTargetForSelector 方法,看是否有備用接收者,將消息轉(zhuǎn)發(fā)給備用接收者處理。
  • 調(diào)用 methodSignatureForSelector 和 forwardInvocation 方法,進(jìn)行完成的消息轉(zhuǎn)發(fā)。

如果經(jīng)過上面三個(gè)步驟,還不能正確處理消息,程序就會(huì)走 doesNotRecognizeSelector 方法,crash 掉。

蹦床模式:就是把一條消息 “反彈” 到另外一個(gè)對象,蹦床一般使用 forwardInvocation 來實(shí)現(xiàn)。

在項(xiàng)目開發(fā)中,事件回調(diào)一般使用:Block、Delegate、NSNotificationCenter;但是在多個(gè)模塊需要監(jiān)聽一個(gè)事件的場景:使用通知會(huì)將項(xiàng)目變得不可控,因?yàn)槿魏我粋€(gè)地方都可以監(jiān)聽這個(gè)通知,在排查問題的時(shí)候就會(huì)變得異常困難,這個(gè)時(shí)候我們可以使用多播委托,實(shí)現(xiàn)一對多回調(diào)。

大致原理:實(shí)現(xiàn)一個(gè)管理類,將需要回調(diào)的對象注冊進(jìn)來,然后將事件消息發(fā)送給這個(gè)管理類,由于這個(gè)管理類是沒有實(shí)現(xiàn)委托方法的,就不能正常處理這個(gè)消息,這個(gè)時(shí)候就會(huì)走消息轉(zhuǎn)發(fā)流程;然后我們通過消息轉(zhuǎn)發(fā)流程,將消息轉(zhuǎn)發(fā)到注冊進(jìn)來的對象中去,這樣子就要可以實(shí)現(xiàn)我們的多播委托了。

具體代碼可以看 Demo 中的 PXYMulticastDelegate 多播委托實(shí)現(xiàn)類。

總結(jié)

Objective-C 利用 Runtime 運(yùn)行時(shí)變成一門動(dòng)態(tài)語言,在開發(fā)過程中,使用 Runtime 相關(guān) API 可以實(shí)現(xiàn)一些很強(qiáng)大的功能,這里我們簡單講到使用 Runtime 完成為分類增加偽屬性、利用 Method SWizzling 來 Hook 方法、實(shí)現(xiàn) NSCoding 自動(dòng)歸檔解檔、實(shí)現(xiàn) KVO Block、多播委托。

當(dāng)然還可以實(shí)現(xiàn)更多的功能,比如字典模型之間的轉(zhuǎn)換、頁面無侵入埋點(diǎn)、監(jiān)聽 App 網(wǎng)絡(luò)流量等等。

還有可以實(shí)現(xiàn)什么好玩的功能,歡迎留言,感激不盡。

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

2022-07-12 12:05:22

JavaSemaphore

2020-06-04 14:40:40

面試題Vue前端

2016-03-03 10:07:39

ios內(nèi)存管理面試總結(jié)

2023-11-13 07:37:36

JS面試題線程

2011-03-24 13:27:37

SQL

2024-04-01 00:00:00

Redis緩存服務(wù)消息隊(duì)列

2021-08-05 05:04:50

熱部署模型字節(jié)

2009-06-06 18:34:05

java面試題

2009-06-06 18:36:02

java面試題

2015-09-02 09:32:56

java線程面試

2014-09-19 11:17:48

面試題

2019-11-26 10:30:11

CSS前端面試題

2023-07-28 08:04:56

StringHeaatomic線程

2025-02-26 07:58:41

2018-03-08 18:40:47

Java百度面試題

2013-01-05 14:51:34

JavaScriptjQuery面試

2023-07-14 08:12:21

計(jì)時(shí)器unsafecontext

2014-07-28 14:00:40

linux面試題

2024-06-04 14:52:28

2021-02-23 12:43:39

Redis面試題緩存
點(diǎn)贊
收藏

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

国产黄色录像视频| 999久久久91| 亚洲区欧美区| 欧美日韩在线一区二区| 性欧美在线看片a免费观看 | 女人天堂在线| 九九热这里有精品| 久久综合色之久久综合| 久久亚洲精品成人| 亚洲第一狼人区| 欧美大片aaa| 亚洲av无一区二区三区久久| 婷婷中文字幕综合| 久久激情电影| 免费观看在线综合| 日韩精品视频中文在线观看| 蜜桃传媒一区二区| 国产传媒一区二区三区| 99热在线这里只有精品| 成人午夜免费在线观看| 日韩国产精品一区二区三区| 色综合久久久无码中文字幕波多| 91啦中文在线| 免费观看在线综合色| 欧美乱人伦中文字幕在线| 8x8x成人免费视频| 操你啦视频在线| 激情文学综合丁香| 中日韩男男gay无套| 超碰一区二区| 日本亚洲最大的色成网站www| 亚洲精品国产精品国产自| 国内自拍中文字幕| 国产高清第一页| 综合激情一区| 日韩欧美精品三级| 美女扒开大腿让男人桶| 高h调教冰块play男男双性文| 狂野欧美性猛交xxxx巴西| 伊人久久综合97精品| 一级片视频免费观看| 麻豆传媒视频在线观看| 国产成人精品一区二| 欧美激情一级欧美精品| 亚洲精品中文字幕在线播放| 亚洲女色av| 亚洲国产成人午夜在线一区| 91精品一区二区| 国产午夜福利一区二区| 欧美人与物videos另类xxxxx| 日本道色综合久久| 公共露出暴露狂另类av| 色呦呦中文字幕| 日本午夜一本久久久综合| 2020欧美日韩在线视频| 国产三级短视频| 国产精品探花在线观看| 91精选在线观看| 日日碰狠狠添天天爽超碰97| 国产极品人妖在线观看| 国产欧美一区二区三区在线老狼| 成人看片人aa| 欧美在线观看不卡| 亚洲色图网站| 久久婷婷国产麻豆91天堂| 色婷婷粉嫩av| 无码日韩精品一区二区免费| 欧美日韩高清一区二区| 成人性生活视频免费看| avtt在线播放| 国产精品久久久久永久免费观看 | 婷婷精品国产一区二区三区日韩| 在线观看黄色网| 精品999日本| 日韩中文在线视频| 亚洲中文字幕一区| 亚洲动漫在线观看| 日韩欧美国产1| 激情综合激情五月| 欧美日韩免费电影| 亚洲每日更新| 日韩成人av影视| 91精品国产免费| 91精品国产一区二区| caoporm超碰国产精品| av在线二区| 欧美日韩一二| 日韩视频免费观看高清完整版在线观看| 一区二区三欧美| 无码熟妇人妻av| 1313精品午夜理伦电影| 欧美视频一区二区在线观看| 欧美亚洲一二三区| 日本综合视频| 日韩欧美精品免费在线| 日韩亚洲欧美视频| 国模冰冰炮一区二区| 欧美日韩精品欧美日韩精品 | 牛牛精品视频在线| 国产网红主播福利一区二区| 国产精品日本一区二区| 97超碰中文字幕| 视频一区中文字幕| 91亚洲国产精品| 飘雪影院手机免费高清版在线观看 | 久久精品成人动漫| 成熟人妻av无码专区| 好吊妞国产欧美日韩免费观看网站| 91精品国产综合久久久久久漫画| 亚洲色图欧美日韩| 久久视频在线观看| 亚洲成人久久久| 日本人妻一区二区三区| 国产亚洲一区| 久久久久九九九九| 亚洲一级黄色大片| 91在线观看一区二区| 国产精品一 二 三| 女女色综合影院| 色中色一区二区| 又色又爽又高潮免费视频国产| 美女日韩欧美| 精品美女被调教视频大全网站| 日批视频免费看| 日本一区二区三区视频| 69av视频在线播放| 毛片视频网站在线观看| 久久九九国产| 国产视频福利一区| 国产成人精品白浆久久69| 国产区一区二| 狠狠色狠狠色综合婷婷tag| 在线观看国产精品日韩av| 国产成人精品片| 亚洲制服av| 日本一区二区不卡| 中文字幕a级片| 狠狠色综合播放一区二区| 精品一区二区三区自拍图片区| 偷拍自拍在线| 中文在线免费一区三区高中清不卡| av女优在线播放| 亚洲一二av| 欧美日韩成人在线视频| 国产三级午夜理伦三级| 成人免费看片98欧美| 91视频精品| 国产在线观看精品| 日本中文字幕电影在线免费观看| 国产精品电影一区二区| h无码动漫在线观看| 在线看的毛片| 精品小视频在线| 99久久精品国产亚洲| 91视频com| 自拍偷拍视频在线| 九九精品调教| 亚洲va欧美va国产va天堂影院| 成人av一级片| 国产美女亚洲精品7777| 美女扒开尿口让男人操亚洲视频网站| 日本少妇性高潮| 麻豆久久久久久| 国产三区精品| 国内精品不卡| 日本高清成人免费播放| 熟女俱乐部一区二区| 欧美激情第10页| 国产精品白嫩初高中害羞小美女 | 国产精品日韩一区二区| 国产美女高潮在线| 亚洲欧美日韩国产成人| 人妻人人澡人人添人人爽| 亚洲制服av| 亚洲精品一品区二品区三品区| 韩国精品一区| 亚洲欧美日韩中文在线制服| 亚洲一卡二卡在线观看| 亚洲综合精品自拍| 亚洲一二区在线观看| 欧美军人男男激情gay| 国产欧美最新羞羞视频在线观看| 超碰porn在线| 亚洲美女激情视频| 国产又粗又大又黄| 天天av天天翘天天综合网色鬼国产 | 亚洲免费资源| 亚洲男人天堂久| 一本到在线视频| 亚洲成国产人片在线观看| 日本一二三区在线| av成人天堂| 亚洲精品一卡二卡三卡四卡| 操欧美女人视频| 欧美精品在线观看| 四虎电影院在线观看| 欧美日韩国产一级二级| 久久久精品99| 成人手机电影网| 日韩久久久久久久久久久久| 亚洲第一二三区| 91入口在线观看| a视频在线播放| 亚洲欧美国产日韩中文字幕| va视频在线观看| 在线国产电影不卡| 色哟哟精品观看| 日韩制服丝袜先锋影音| 黄色污污在线观看| 欧美视频免费| 91精品国产自产在线| gogo久久| 精品视频—区二区三区免费| 亚洲在线精品视频| 日韩欧美中文第一页| 久久一级黄色片| 综合久久久久综合| 亚洲欧美一区二区三区不卡| 香蕉久久网站| 亚洲综合大片69999| 伊人影院在线视频| 精品日韩在线观看| 四虎影院在线免费播放| 综合激情成人伊人| av电影在线不卡| 91视视频在线直接观看在线看网页在线看| 在线看免费毛片| 青青草精品视频| 国产v亚洲v天堂无码久久久| 麻豆导航在线观看| 一区二区电影免费观看| 久久久久久久久久久妇女| 91丨国产丨九色丨pron| 国产精品久久久久久久电影| 免费一二一二在线视频| 欧美激情国产日韩精品一区18| 国产成人愉拍精品久久| 亚洲欧美日韩国产中文在线| 日韩高清一二三区| 九九精品视频在线看| 999一区二区三区| 亚洲激情久久| 欧美aaa在线观看| 999国产精品| 亚洲综合视频一区| 一区三区自拍| 99理论电影网| 美女写真久久影院| 久久国产精品偷| av网站导航在线观看免费| 久久久国产一区二区三区| 麻豆影院在线| 超薄丝袜一区二区| 日本理论片午伦夜理片在线观看| 日韩精品在线免费观看| 视频一区二区免费| 日韩精品免费电影| 麻豆影视在线| 中文字幕日韩视频| 91精品久久久久久久久久久久久| 丰满人妻一区二区| 精品久久国产字幕高潮| 天天干视频在线观看| 精品伊人久久97| 成人免费黄色网页| xx视频.9999.com| 人妻va精品va欧美va| 欧美亚洲综合久久| 一级黄色片在线观看| 91精品国产综合久久香蕉麻豆| 国产乱码久久久久| 色哟哟一区二区在线观看 | 亚洲永久精品国产| 日本少妇吞精囗交| 91久久精品网| 国产精品爽爽久久久久久| 日韩午夜中文字幕| 午夜性色福利视频| 91精品麻豆日日躁夜夜躁| 精品国产av鲁一鲁一区| 欧美无人高清视频在线观看| 国产一区二区网站| 亚洲国产成人精品久久久国产成人一区| 香蕉视频免费在线看| 国产午夜精品视频| 丝袜视频国产在线播放| 在线视频国产日韩| 欧美人与禽性xxxxx杂性| 日韩免费av一区二区| 综合久久伊人| 玖玖玖精品中文字幕| 在线观看日韩| 农村妇女精品一二区| 亚洲美洲欧洲综合国产一区| 成人黄色一区二区| 国产成人av一区二区三区在线 | 国产一级精品视频| 色的视频在线免费看| 亚洲欧洲美洲在线综合| 亚洲国产精品久久久久久6q| 欧美男人的天堂一二区| 中文字幕日日夜夜| 精品国产乱码久久久久久老虎 | 精品99在线观看| 国产精品国产自产拍高清av| 久久久久亚洲AV| 欧美私人免费视频| 亚洲女同志亚洲女同女播放| 中文字幕视频在线免费欧美日韩综合在线看 | 亚洲一线二线三线视频| 国产十六处破外女视频| 亚洲精品日产精品乱码不卡| 日韩欧美一级视频| 欧美一区二区视频网站| 电影av在线| 色偷偷88888欧美精品久久久| 91丝袜在线| 91亚洲精品一区二区| 欧美综合在线视频观看| a在线视频观看| 国产成人aaa| 疯狂试爱三2浴室激情视频| 亚洲精品国产精华液| 欧美黑人一级片| 欧美日韩电影一区| 国产在线视频你懂得| 色爱精品视频一区| 欧美性suv| 欧美精品入口| 一本色道久久综合狠狠躁的推荐| 国产裸体写真av一区二区| 国产 欧美 精品| 最新的欧美黄色| 日本精品在线中文字幕| 精品一区二区三区国产| 日韩视频一区二区三区在线播放免费观看| 午夜激情视频网| 最新热久久免费视频| 91成年人视频| 精品激情国产视频| 欧美视频精品| 三年中国中文在线观看免费播放| 免费精品视频在线| 国产又粗又猛又爽又黄的视频小说| 91国产免费看| av小片在线| 成人午夜黄色影院| 先锋资源久久| 亚洲一二三不卡| 一区二区三区美女| 天天躁日日躁aaaa视频| 92国产精品| 国产成人久久久| 在线播放高清视频www| 国产免费一区| 99日韩精品| 日本黄色网址大全| 色婷婷一区二区| av每日在线更新| 亚洲一区二区中文| 欧美色图首页| av黄色一级片| 中文字幕一区av| 国产伦精品一区二区三区四区 | 欧美一区二区三区黄片| 欧美激情视频在线免费观看 欧美视频免费一 | 一二三四在线观看视频| 一区二区三区在线观看网站| 国产高清免费在线观看| 欧美激情精品久久久久久黑人| 黄色美女久久久| 欧美牲交a欧美牲交aⅴ免费真| 在线观看国产成人| 亚洲永久免费av| 三级国产在线观看| 国产精品三级美女白浆呻吟| 国产精品高潮呻吟久久久久| www.com毛片| 中文欧美字幕免费| av中文字幕免费在线观看| 97免费视频在线| 欧美综合另类| 亚洲国产精品第一页| 欧美性生活大片免费观看网址| 第三区美女视频在线| 亚洲最大的免费| 久久精品午夜| 一区二区在线观看免费视频| 日韩风俗一区 二区| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 国产成人精品aa毛片| 色一情一乱一伦| 精品国产青草久久久久福利| 在线能看的av网址| 欧美 日韩 国产 在线观看| caoporm超碰国产精品| 亚洲一卡二卡在线| 奇门遁甲1982国语版免费观看高清| 国产欧美三级电影| 国产一级特黄a大片免费|