日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RxSwift之深入解析特殊序列deallocating与deallocated的源码实现

發布時間:2024/5/21 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RxSwift之深入解析特殊序列deallocating与deallocated的源码实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、引言

  • 在 RxSwfit 中,有兩個特殊序列:deallocating 與 deallocated,deinit 等價于 dealloc。在 deallocating 與 deallocated 兩個序列被訂閱時,那么當 deinit 調用時會觸發這兩個序列發送信號,它們的執行順序為:deallocating -> deinit -> deallocated。
  • 現有如下的測試代碼:
override func viewDidLoad() {_ = rx.deallocating.subscribe(onNext: { () inprint("準備撤退")})_ = rx.deallocated.subscribe(onNext: { () inprint("已經撤退")})}override func viewDidAppear(_ animated: Bool) {print("進來了")}deinit {print("\(self.classForCoder) 銷毀")}
  • 運行如下:
進來了準備撤退TestViewController 銷毀已經撤退
  • 從上面的測試代碼可以看出,RxSwift 對 deinit(dealloc)做了處理,通常通過黑魔法就能夠達到該效果,在 OC 中,經常使用 runtime 來交換方法,在方法內部處理需要做的事情,那么 RxSwift 是如何實現的呢?

二、deallocating 的源碼分析

① deallocating 序列的創建

  • deallocating 是 Reactive 的擴展方法,繼承自 AnyObject,相當于 OC 中的 NSObject,如下所示:
extension Reactive where Base: AnyObject {public var deallocating: Observable<()> {return self.synchronized {do {let proxy: DeallocatingProxy = try self.registerMessageInterceptor(deallocSelector)return proxy.messageSent.asObservable()}catch let e {return Observable.error(e)}}}}
  • 源碼分析:
    • 使用同步鎖來保證線程安全;
    • 內部通過 self.registerMessageInterceptor 傳入 deallocSelector 來初始化一個 DeallocatingProxy 對象;
    • 通過 messageSent 獲取一個 ReplaySubject 序列。
  • deallocSelector,顧名思義,明顯是一個方法選擇器,它的實現是使用 NSSelectorFromString 方法來獲取 dealloc 選擇器,如下所示:
private let deallocSelector = NSSelectorFromString("dealloc")
  • 由此可以看出,RxSwift 確實是在 dealloc(即 Swfit 中的 deinit)上做了處理,這里只是初始化了 proxy 對象,具體消息如何傳出來的,繼續往下探究。

② proxy 對象的創建

  • 繼續查看 registerMessageInterceptor 方法:
fileprivate func registerMessageInterceptor<T: MessageInterceptorSubject>(_ selector: Selector) throws -> T {let rxSelector = RX_selector(selector)let selectorReference = RX_reference_from_selector(rxSelector)let subject: Tif let existingSubject = objc_getAssociatedObject(self.base, selectorReference) as? T {subject = existingSubject}else {subject = T()objc_setAssociatedObject(self.base,selectorReference,subject,.OBJC_ASSOCIATION_RETAIN_NONATOMIC)}if subject.isActive {return subject}var error: NSError?let targetImplementation = RX_ensure_observing(self.base, selector, &error)if targetImplementation == nil {throw error?.rxCocoaErrorForTarget(self.base) ?? RxCocoaError.unknown}subject.targetImplementation = targetImplementation!return subject}
  • 源碼分析:
    • selector 外部傳入的 dealloc 的方法選擇器;
    • RX_selector 方法通過 dealloc 方法名構建了另外一個方法選擇器,如下:
SEL __nonnull RX_selector(SEL __nonnull selector) {NSString *selectorString = NSStringFromSelector(selector);return NSSelectorFromString([RX_PREFIX stringByAppendingString:selectorString]);}
  • 由上可以看出,代碼進入到 OC 區了,使用了 OC 的方法來滿足需求。沿著想要的結果去找方法,前面提到 dealloc 可能被替換了,通過代碼中的 targetImplementation,貌似是一個目標實現,進入代碼查看:
IMP __nullable RX_ensure_observing(id __nonnull target, SEL __nonnull selector, NSErrorParam error) {__block IMP targetImplementation = nil;@synchronized(target) {@synchronized([target class]) {[[RXObjCRuntime instance] performLocked:^(RXObjCRuntime * __nonnull self) {targetImplementation = [self ensurePrepared:targetforObserving:selectorerror:error];}];}}return targetImplementation;}
  • 源碼分析:
    • RX_ensure_observing 返回一個 IMP 函數指針;
    • [RXObjCRuntime instance] 實際上是一個 NSObject 的一個單例,內部采用互斥鎖,向外部提供當前單例對象;
    • ensurePrepared 消息發送的入口點。

③ ensurePrepared 函數

  • 直接搜索 ensurePrepared 方法:
-(IMP __nullable)ensurePrepared:(id __nonnull)target forObserving:(SEL __nonnull)selector error:(NSErrorParam)error {Method instanceMethod = class_getInstanceMethod([target class], selector);if (instanceMethod == nil) {RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomaincode:RXObjCRuntimeErrorSelectorNotImplementeduserInfo:nil], nil);}if (selector == @selector(class)|| selector == @selector(forwardingTargetForSelector:)|| selector == @selector(methodSignatureForSelector:)|| selector == @selector(respondsToSelector:)) {RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomaincode:RXObjCRuntimeErrorObservingPerformanceSensitiveMessagesuserInfo:nil], nil);}// For `dealloc` message, original implementation will be swizzled.// This is a special case because observing `dealloc` message is performed when `observeWeakly` is used.//// Some toll free bridged classes don't handle `object_setClass` well and cause crashes.//// To make `deallocating` as robust as possible, original implementation will be replaced.if (selector == deallocSelector) {Class __nonnull deallocSwizzingTarget = [target class];IMP interceptorIMPForSelector = [self interceptorImplementationForSelector:selector forClass:deallocSwizzingTarget];if (interceptorIMPForSelector != nil) {return interceptorIMPForSelector;}if (![self swizzleDeallocating:deallocSwizzingTarget error:error]) {return nil;}interceptorIMPForSelector = [self interceptorImplementationForSelector:selector forClass:deallocSwizzingTarget];if (interceptorIMPForSelector != nil) {return interceptorIMPForSelector;}}}
  • 源碼分析:
    • class_getInstanceMethod 獲取當前界面對象的 dealloc 方法,來判斷該類是否存在該方法,容錯處理,對方法替換沒關系;
    • 注釋中說明了替換原始的 dealloc 方法;
    • deallocSwizzingTarget 獲取到要替換 dealloc 的目標類;
    • swizzleDeallocating 傳入目標類準備替換 dealloc 為 deallocating。

④ swizzleDeallocating

  • 可以看到,有一個如下的函數宏定義:
SWIZZLE_INFRASTRUCTURE_METHOD(void,swizzleDeallocating,,deallocSelector,DEALLOCATING_BODY)
  • 內部整理如下:
#define SWIZZLE_INFRASTRUCTURE_METHOD(return_value, method_name, parameters, method_selector, body, ...)SWIZZLE_METHOD(return_value, -(BOOL)method_name:(Class __nonnull)class parameters error:(NSErrorParam)error{SEL selector = method_selector; , body, NO_BODY, __VA_ARGS__)// common base#define SWIZZLE_METHOD(return_value, method_prototype, body, invoked_body, ...)method_prototype__unused SEL rxSelector = RX_selector(selector);IMP (^newImplementationGenerator)(void) = ^() {__block IMP thisIMP = nil;id newImplementation = ^return_value(__unsafe_unretained id self DECLARE_ARGUMENTS(__VA_ARGS__)) {body(__VA_ARGS__)struct objc_super superInfo = {.receiver = self,.super_class = class_getSuperclass(class)};return_value (*msgSend)(struct objc_super *, SEL DECLARE_ARGUMENTS(__VA_ARGS__))= (__typeof__(msgSend))objc_msgSendSuper;@try {return msgSend(&superInfo, selector ARGUMENTS(__VA_ARGS__));}@finally { invoked_body(__VA_ARGS__) }};thisIMP = imp_implementationWithBlock(newImplementation);return thisIMP;};IMP (^replacementImplementationGenerator)(IMP) = ^(IMP originalImplementation) {__block return_value (*originalImplementationTyped)(__unsafe_unretained id, SEL DECLARE_ARGUMENTS(__VA_ARGS__) )= (__typeof__(originalImplementationTyped))(originalImplementation);__block IMP thisIMP = nil;id implementationReplacement = ^return_value(__unsafe_unretained id self DECLARE_ARGUMENTS(__VA_ARGS__) ) {body(__VA_ARGS__)@try {return originalImplementationTyped(self, selector ARGUMENTS(__VA_ARGS__));}@finally { invoked_body(__VA_ARGS__) }};thisIMP = imp_implementationWithBlock(implementationReplacement);return thisIMP;};return [self ensureSwizzledSelector:selectorofClass:classnewImplementationGenerator:newImplementationGeneratorreplacementImplementationGenerator:replacementImplementationGeneratorerror:error];}
  • 代碼看上去比較繁瑣,可以將參數一一對比,能夠看到:內部實際是重新組合了一個方法,參數為當前界面對象的類 deallocSwizzingTarget,實現了一個閉包并返回 IMP 函數指針:
    • replacementImplementationGenerator 代碼塊保存原始 dealloc 的函數地址,并在內部調用;
    • 在代碼塊中調用了 imp_implementationWithBlock 函數,獲取代碼塊的函數指針。

⑤ imp_implementationWithBlock

  • 該函數接收一個 block 將其拷貝到堆區,返回一個 IMP 函數指針,把 block 當做 OC 中類的方法實現來使用。如下所示,用 block 代替原有方法實現:
- (void)myMethod {NSLog(@"來了");}……// 創建blockvoid (^myblock)(int val) = ^(int val){NSLog(@"myblock");};// 獲取block的IMPIMP myblockImp = imp_implementationWithBlock(myblock);// 獲取要替換的方法的IMPMethod method = class_getInstanceMethod(self.class, @selector(myMethod));// 替換函數指針,指向blockmethod_setImplementation(method, myblockImp);// 執行原始方法[self myMethod];
  • 使用該函數是為了用代碼塊來替換一個需要替換的方法。以上宏定義的函數最后調用了 ensureSwizzledSelector 方法。

⑥ ensureSwizzledSelector

  • 搜索 ensureSwizzledSelector,查看代碼:
- (BOOL)ensureSwizzledSelector:(SEL __nonnull)selectorofClass:(Class __nonnull)classnewImplementationGenerator:(IMP(^)(void))newImplementationGeneratorreplacementImplementationGenerator:(IMP (^)(IMP originalImplementation))replacementImplementationGeneratorerror:(NSErrorParam)error {if ([self interceptorImplementationForSelector:selector forClass:class] != nil) {DLOG(@"Trying to register same intercept at least once, this sounds like a possible bug");return YES;}#if TRACE_RESOURCESatomic_fetch_add(&numberOInterceptedMethods, 1);#endifDLOG(@"Rx is swizzling `%@` for `%@`", NSStringFromSelector(selector), class);Method existingMethod = class_getInstanceMethod(class, selector);ALWAYS(existingMethod != nil, @"Method doesn't exist");const char *encoding = method_getTypeEncoding(existingMethod);ALWAYS(encoding != nil, @"Encoding is nil");IMP newImplementation = newImplementationGenerator();if (class_addMethod(class, selector, newImplementation, encoding)) {// new method added, job done[self registerInterceptedSelector:selector implementation:newImplementation forClass:class];return YES;}imp_removeBlock(newImplementation);// if add fails, that means that method already exists on targetClassMethod existingMethodOnTargetClass = existingMethod;IMP originalImplementation = method_getImplementation(existingMethodOnTargetClass);ALWAYS(originalImplementation != nil, @"Method must exist.");IMP implementationReplacementIMP = replacementImplementationGenerator(originalImplementation);ALWAYS(implementationReplacementIMP != nil, @"Method must exist.");IMP originalImplementationAfterChange = method_setImplementation(existingMethodOnTargetClass, implementationReplacementIMP);ALWAYS(originalImplementation != nil, @"Method must exist.");// If method replacing failed, who knows what happened, better not trying again, otherwise program can get// corrupted.[self registerInterceptedSelector:selector implementation:implementationReplacementIMP forClass:class];if (originalImplementationAfterChange != originalImplementation) {THREADING_HAZARD(class);return NO;}return YES;}
  • 源碼分析:
    • interceptorImplementationForSelector 查看 dealloc 是否存在對應的函數,如果繼續往下執行,則開始對 dealloc 做替換;
    • class_addMethod,既然 dealloc 存在對應的函數,添加必然失敗,繼續向下執行;
    • method_setImplementation,開始設置 dealloc 的 IMP 指向上面提到的代碼塊 replacementImplementationGenerator 中。
  • 在此處即替換了系統方法,當系統調用了 dealloc 時就會觸發 replacementImplementationGenerator 中的 block 方法:
IMP (^replacementImplementationGenerator)(IMP) = ^(IMP originalImplementation) {__block return_value (*originalImplementationTyped)(__unsafe_unretained id, SEL DECLARE_ARGUMENTS(__VA_ARGS__) )= (__typeof__(originalImplementationTyped))(originalImplementation);__block IMP thisIMP = nil;id implementationReplacement = ^return_value(__unsafe_unretained id self DECLARE_ARGUMENTS(__VA_ARGS__) ) {body(__VA_ARGS__)@try {return originalImplementationTyped(self, selector ARGUMENTS(__VA_ARGS__));}@finally { invoked_body(__VA_ARGS__) }};thisIMP = imp_implementationWithBlock(implementationReplacement);return thisIMP;};
  • 可以看到存在一個 body 函數的調用,body 做了什么呢?

⑦ body-DEALLOCATING_BODY

  • 搜索找到宏 DEALLOCATING_BODY,整理如下:
#define DEALLOCATING_BODY(...)id<RXDeallocatingObserver> observer = objc_getAssociatedObject(self, rxSelector);if (observer != nil && observer.targetImplementation == thisIMP) {[observer deallocating];}
  • 源碼分析:
    • rxSelector 即是要替換的方法選擇器即 deallocating 對應的選擇器;
    • observer 序列在此處調用了 deallocating,此時 deallocating 就被調用,commpleted 結束序列,因此不需要在外部添加垃圾袋,如下:
@objc func deallocating() {self.messageSent.on(.next(()))}deinit {self.messageSent.on(.completed)}
  • 此處即是向訂閱發送消息,deallocating 調用后,body 調用后即調用代碼塊保存的原始 dealloc 函數:
return originalImplementationTyped(self, selector ARGUMENTS(__VA_ARGS__));
  • 由上可知,originalImplementationTyped 是 dealloc 的原始函數,在此處調用了 dealloc。如果需要驗證該處就是觸發的 dealloc 方法,可以將次閉包的參數換成 viewDidAppear,在 RxCocoa -> _RXObjeCRuntime.m 中的 ensureSwizzledSelector 方法中替換:
replacementImplementationGenerator(originalImplementation);// 替換為IMP viewdidAppear = class_getMethodImplementation(class, @selector(viewDidAppear:));IMP implementationReplacementIMP = replacementImplementationGenerator(viewdidAppear);
  • 替換為視圖出現時調用的方法,如果在掉用 deallocating 后,viewdidAppear 被調用就能夠驗證上面所指之處就是觸發的 dealloc 方法。
  • 上面的測試代碼:
    • 替換前的運行結果:
進來了準備撤退TestViewController 銷毀已經撤退
    • 替換后的運行結果則為:
進來了準備撤退進來了
  • 通過以上測試,能夠確定 dealloc 是在代碼塊中調用的(注意:在修改源碼后要 clean 一下工程,否則緩存會影響執行結果)。

三、deallocated 的源碼分析

  • 繼續看看 deallocated 序列是如何產生,又是如何在 dealloc 調用完成之后執行的:
public var deallocated: Observable<Void> {return self.synchronized {if let deallocObservable = objc_getAssociatedObject(self.base, &deallocatedSubjectContext) as? DeallocObservable {return deallocObservable._subject}let deallocObservable = DeallocObservable()objc_setAssociatedObject(self.base, &deallocatedSubjectContext, deallocObservable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)return deallocObservable._subject}}
  • 關聯了創建的序列,保證當前控制器內的序列對象只有一個。
  • DeallocObservable 的源碼如下:
fileprivate final class DeallocObservable {let _subject = ReplaySubject<Void>.create(bufferSize:1)init() {}deinit {self._subject.on(.next(()))self._subject.on(.completed)} }
  • 源碼分析:
    • 內部也初始化一個 ReplaySubject 序列,用來發送消息;
    • 在對象銷毀時調用了 .next 和 .completed,發送一條消息,再發送一條完成消息終止序列,因此在外部創建序列不需要添加垃圾袋。

四、總結

  • 在 RxSwift 中提供了兩個關于 dealloc(deinit)的序列,觀察 dealloc 的調用,其中 deallocating 內部替換了原生的 dealloc 方法從而達到監聽 dealloc 的調用;
  • deallocating 并不是交換方法,而是在 replacementImplementationGenerator 代碼塊中先保留了 dealloc 的函數地址,再通過 imp_implementationWithBlock 設置 dealloc 的 IMP,指向了 replacementImplementationGenerator 代碼塊;
  • 調用 dealloc 方法就會調用了代碼塊,在代碼塊內部通過 body 函數調用了 deallocating 方法,之后執行代碼塊中保留的原 dealloc 函數。

總結

以上是生活随笔為你收集整理的RxSwift之深入解析特殊序列deallocating与deallocated的源码实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

综合色狠狠 | 91精品国产乱码久久桃 | 久久高清免费观看 | 欧美国产亚洲精品久久久8v | 区一区二区三区中文字幕 | 新版资源中文在线观看 | 丁香久久综合 | 免费91麻豆精品国产自产在线观看 | 亚洲精品网站在线 | 国产一级免费视频 | 午夜精品久久久久久99热明星 | 久草免费手机视频 | 日本mv大片欧洲mv大片 | 亚洲国产欧美一区二区三区丁香婷 | 黄色高清视频在线观看 | 在线播放第一页 | 99久久日韩精品视频免费在线观看 | 久久久久久久久久伊人 | 国产在线观看污片 | 久久久久综合精品福利啪啪 | 九草在线视频 | 国产精品二区在线观看 | 国产中文字幕在线免费观看 | 成人免费看片98欧美 | 99精品国产在热久久下载 | 久久99精品国产99久久6尤 | 亚洲在线视频播放 | 91成人看片 | 亚洲视频久久 | 美女久久久久久久 | 久久久久国产视频 | av在线成人 | 91久久久久久久一区二区 | 中文成人字幕 | 国产精品久久久av | 久久久精品日本 | 99av在线视频| 亚洲成人精品国产 | 99久久精品日本一区二区免费 | 国产黄色av网站 | 日韩久久精品一区二区三区 | 久久精品美女视频网站 | 日本黄色大片免费 | 不卡中文字幕在线 | 99se视频在线观看 | 另类五月激情 | 九九视频网站 | 日本久久综合网 | 欧美色婷婷 | 亚洲国产高清在线 | 手机在线小视频 | 亚洲无人区小视频 | 在线观看小视频 | www.久草.com| 人人狠狠综合久久亚洲婷 | 中文字幕在线看人 | 五月天亚洲综合 | 九九热在线免费观看 | 免费看一及片 | 99久久夜色精品国产亚洲96 | 六月丁香色婷婷 | 成人97视频 | 欧美激情精品久久久久久免费印度 | 天堂网在线视频 | 99热都是精品 | 99爱爱| 中文字幕在线色 | 欧美日韩在线精品一区二区 | 婷婷视频在线 | 久久久精品国产一区二区三区 | 色狠狠综合天天综合综合 | 国产精品久久久久久久久蜜臀 | 国产精品在线看 | 美女久久久久 | 国产精品自在欧美一区 | 五月开心综合 | 欧美人体xx | 国产精品久久久久一区二区三区共 | 美女久久视频 | 久久九九久久 | www.天天成人国产电影 | 在线小视频| 天天搞天天干 | 一区二区视频免费在线观看 | 国产午夜三级一区二区三 | 国产一区影院 | 一区二区欧美日韩 | 白丝av免费观看 | 国产99在线播放 | 在线国产欧美 | 狠狠干夜夜操天天爽 | 午夜黄色一级片 | 成人久久精品视频 | 日韩欧美xxx | 国产精品一区二区三区久久 | 国产在线精品一区二区三区 | 97在线成人| 麻豆久久一区 | 国产97在线观看 | 在线视频观看你懂的 | 综合网天天 | 最近中文字幕大全中文字幕免费 | 在线欧美中文字幕 | 国产一区二区三区久久久 | 亚洲高清色综合 | 久久精品中文字幕免费mv | 亚洲精品乱码久久久久久 | 久久综合日 | 国产一级免费观看 | 免费国产在线观看 | 日韩精品免费一线在线观看 | 美女黄网久久 | 中文字幕在线播放一区二区 | 亚洲国产精品电影在线观看 | 天天av在线播放 | 亚洲精品中文在线观看 | 97超碰成人在线 | 亚洲天堂社区 | 日韩视频免费播放 | 天天夜夜操 | 片网站| 在线性视频日韩欧美 | 在线观看视频一区二区三区 | 亚洲精品国偷拍自产在线观看 | 欧美一区免费观看 | 色综合天天干 | 欧美激情视频在线观看免费 | 欧美日韩不卡一区 | 日韩a欧美| 久久在线精品视频 | 成人a免费| 在线播放 日韩专区 | 中文字幕在线观看2018 | 国产高清中文字幕 | 国产亚洲精品bv在线观看 | 成年人免费观看在线视频 | 九九热在线观看 | 91九色在线观看 | 黄色影院在线观看 | 亚洲精品一区二区18漫画 | bbb搡bbb爽爽爽 | 精品国产乱码久久久久久1区二区 | 中文字幕中文字幕在线中文字幕三区 | 精品视频123区在线观看 | 黄色av电影在线观看 | 亚洲黄色区 | 亚洲日本激情 | 国产精品美女久久久网av | 日本黄色免费大片 | 西西4444www大胆艺术 | 激情综合色播五月 | 国产一级免费在线观看 | 日日夜夜精品免费 | 国产婷婷在线观看 | 日本三级香港三级人妇99 | 日韩精品欧美专区 | 99婷婷狠狠成为人免费视频 | 在线日韩精品视频 | 婷婷干五月 | 日韩剧| 精品亚洲成人 | 亚洲一区黄色 | 激情欧美xxxx| 一级免费黄视频 | 啪嗒啪嗒免费观看完整版 | 2023亚洲精品国偷拍自产在线 | 亚洲国产黄色 | 久久国产乱 | 国产午夜一级毛片 | 日韩视频一区二区三区在线播放免费观看 | 国产成人a亚洲精品v | 日韩中文免费视频 | 成人毛片100免费观看 | 99视频在线精品免费观看2 | 最近最新中文字幕视频 | 免费视频国产 | 中文字幕首页 | 日日干精品| 国产精品电影在线 | 九九激情视频 | 99热最新地址 | a午夜在线 | 香蕉视频国产在线 | 国产一级电影免费观看 | 超级碰视频| 久久亚洲热 | 久久久久久久久久电影 | 最新中文字幕视频 | 国产精品久久久久久99 | 日本久久中文字幕 | 久久久99国产精品免费 | 久久黄网站 | 97在线免费视频观看 | 亚洲高清免费在线 | 成人毛片在线观看 | 亚洲天堂网在线视频观看 | 日韩极品视频在线观看 | 夜夜夜| 久久九精品 | av黄色免费在线观看 | 日日干日日操 | 人人干在线 | 欧美疯狂性受xxxxx另类 | 美女视频免费精品 | 日韩毛片在线一区二区毛片 | 日韩电影精品 | 波多野结衣一区二区三区中文字幕 | 欧美极品xxx | 欧美日韩精品国产 | 国产精品99视频 | 国产成人免费在线观看 | 69av网| 91伊人久久大香线蕉蜜芽人口 | 久久精品79国产精品 | 91精品国自产在线观看 | 五月天,com| 500部大龄熟乱视频 欧美日本三级 | 最近免费中文字幕mv在线视频3 | 亚洲精品国产日韩 | 在线观看日韩一区 | 99精品欧美一区二区三区黑人哦 | 中午字幕在线观看 | 97在线视频观看 | 色视频在线观看 | 中文区中文字幕免费看 | 一级免费观看 | 在线天堂8√| 国产成人一区二区精品非洲 | 欧美a在线免费观看 | 欧美性极品xxxx娇小 | 91色在线观看 | 四虎5151久久欧美毛片 | 夜夜躁日日躁 | 丁香在线观看完整电影视频 | 69亚洲精品 | 色丁香色婷婷 | 久久最新网址 | 亚洲成av人片一区二区梦乃 | 国产色小视频 | 亚洲国产精品成人综合 | 最新国产一区二区三区 | 2021国产在线| 欧美精品一区二区免费 | 免费在线一区二区三区 | 久久天天躁狠狠躁亚洲综合公司 | 国产在线精品国自产拍影院 | 黄污视频大全 | 国产成人在线观看免费 | 欧美精品做受xxx性少妇 | 国产精品久久久久久久婷婷 | 色香天天 | 亚洲一区精品人人爽人人躁 | 精品国产乱码久久久久久1区二区 | 久久观看免费视频 | 久久经典视频 | 天天干天天干天天 | 成年人黄色免费视频 | 亚洲成人精品久久 | 日韩欧美在线视频一区二区 | 91亚瑟视频 | 国产成人久 | 国产一区欧美在线 | 国产精品毛片一区二区 | 精品国产乱码久久久久 | 亚洲精品中文在线资源 | 婷婷在线视频观看 | 成人在线播放网站 | 精品成人久久 | 免费国产在线视频 | 91精品国产三级a在线观看 | 欧美性色综合网 | 国产在线美女 | 天堂av网站 | 久久99国产综合精品免费 | 狠狠的操狠狠的干 | 国产 欧美 在线 | 国产精品免费视频一区二区 | 国内外成人在线 | 国产超碰在线观看 | 日韩精品在线视频免费观看 | 黄色三级免费片 | 97视频免费观看 | 九九免费精品视频 | 18国产精品福利片久久婷 | 免费国产亚洲视频 | 99色免费| 91成人免费视频 | 超碰人人射 | 三级在线视频观看 | 韩国在线视频一区 | 日韩精品大片 | 一色屋精品视频在线观看 | 粉嫩av一区二区三区四区在线观看 | 亚洲精品美女在线观看播放 | 亚洲第一色 | 亚洲精品www久久久久久 | 久久综合九色综合欧美就去吻 | 国产精品久久久久永久免费观看 | 日韩在线观看一区二区 | 亚洲最大av网站 | 欧美另类巨大 | 免费视频你懂得 | 最新午夜 | 天堂激情网 | 免费亚洲视频在线观看 | 91麻豆精品一区二区三区 | 天天草天天色 | 日本性视频 | 91c网站色版视频 | 国产精品久久久久久久毛片 | 免费在线黄网 | 午夜精品久久久久99热app | 色婷婷在线观看视频 | 亚洲国产精品免费 | 天天激情综合网 | 亚洲精品国产品国语在线 | av成人在线电影 | 在线观看91av | www.91成人| 国产成人精品亚洲a | 丁香五月网久久综合 | 一级片免费在线 | 99精品免费视频 | 最新日韩视频在线观看 | 久久婷婷综合激情 | 91久久精品一区二区三区 | 天天操天天色天天 | 欧美精品一区二区在线观看 | 久久久久国产a免费观看rela | 黄色毛片大全 | 欧美一级片在线观看视频 | 欧美在线视频日韩 | 日日夜夜91 | 深夜福利视频在线观看 | 国产在线毛片 | 视频一区二区精品 | 欧美日韩高清在线一区 | 国产精品成人自产拍在线观看 | 国产97在线观看 | 精品自拍av | 字幕网资源站中文字幕 | 九九在线免费视频 | 黄色三级免费观看 | 亚洲国产精品视频在线观看 | 国产高清无线码2021 | 天堂视频中文在线 | www.夜色321.com| 一区二区伦理 | 精品超碰| 日本一区二区三区免费观看 | 国产成人精品综合久久久 | 色鬼综合网 | 亚洲欧美日韩在线看 | 天天干天天碰 | 日韩美av在线 | 69精品视频在线观看 | 欧美日在线观看 | 日韩一区二区在线免费观看 | av黄色成人 | 日韩高清不卡一区二区三区 | 99热在线网站| 中文字幕一区二区在线播放 | 国产精品久久久久久久久久 | 久久久久久不卡 | 97国产在线视频 | 亚洲成人av影片 | 免费在线观看不卡av | 国产一及片 | 人人cao| 午夜999 | 中文字幕免费一区二区 | 亚洲国产美女精品久久久久∴ | 夜夜夜草| 中文字幕av在线免费 | 97av视频在线 | 亚洲国产中文字幕 | 久久久鲁| 日韩激情视频在线观看 | 91在线小视频 | 亚洲精品久久久久中文字幕二区 | 蜜臀久久99精品久久久无需会员 | 九九视频这里只有精品 | 99精品免费久久久久久日本 | 日本 在线 视频 中文 有码 | 少妇视频在线播放 | 国产一级淫片在线观看 | 久久精品免费看 | 日韩在线字幕 | 黄色网在线免费观看 | 99热999| 亚洲精品成人网 | 中文字幕在线国产精品 | 九九视频在线播放 | 色婷婷激情四射 | 久草在线播放视频 | 丝袜网站在线观看 | 国产精品亚洲人在线观看 | 天天躁天天躁天天躁婷 | 人人舔人人爽 | 91精品久久久久久久99蜜桃 | 一区二区视频欧美 | 欧美小视频在线观看 | 狠狠操综合 | 中文字幕在线一区二区三区 | 日日躁你夜夜躁你av蜜 | 亚洲男男gaygay无套 | 日韩高清在线看 | 中文字幕色在线 | 99久久精品国 | 亚洲aⅴ乱码精品成人区 | 免费看黄20分钟 | 日韩精品大片 | 在线成人国产 | 欧美一级片在线播放 | a级成人毛片 | 日本视频久久久 | 天天综合天天做天天综合 | 国产精选在线 | 国产精品久久久久久久av大片 | 中文资源在线播放 | 久久综合久久鬼 | 精品国产乱子伦一区二区 | www.91国产| 狠狠干夜夜爱 | 91丨九色丨91啦蝌蚪老版 | 婷色| 香蕉久久久久久久 | 五月婷婷在线播放 | 九九精品久久久 | 黄色av免费在线 | 国产成人福利在线观看 | 国产精品毛片一区二区 | 国产成在线观看免费视频 | 成人免费在线视频观看 | 日本黄色a级大片 | 精品在线观看国产 | 天天色天天操综合网 | 在线观看亚洲国产精品 | 蜜臀av性久久久久蜜臀aⅴ流畅 | av中文在线| 国产手机在线 | 久久不色 | 黄色中文字幕在线 | 日日干干夜夜 | 国产精品入口a级 | 国产午夜精品一区二区三区四区 | 国产高清中文字幕 | 久久在线视频精品 | 久久精品屋 | 在线电影av | 国产亚洲va综合人人澡精品 | 在线观看视频一区二区三区 | 免费黄色在线播放 | 国产破处精品 | 九九精品久久 | 国产精品久久久久久久免费 | 免费在线国产黄色 | 亚洲精品一区二区三区高潮 | 国产日韩欧美精品在线观看 | 婷婷丁香综合 | 天天操福利视频 | 欧美一级电影 | 中文字幕日本特黄aa毛片 | 欧美精品久久久久久久久久白贞 | 黄色大片国产 | 国产视频亚洲 | 中文日韩在线视频 | 亚洲无吗av| 韩国一区二区三区在线观看 | 久久成人欧美 | 免费看片色 | 久久成人18免费网站 | 国产96精品 | 欧美日韩中文字幕在线视频 | 日韩精品一区二区不卡 | 人人射人人 | 国产伦精品一区二区三区照片91 | 国产成人精品一区二区三区 | 香蕉看片 | 欧美一区二区精美视频 | 精品美女国产在线 | 久久精品国产v日韩v亚洲 | 国产裸体永久免费视频网站 | 亚洲精品三级 | 国产成人免费观看久久久 | 成人三级网址 | 97超碰站 | 久久伦理 | 久久久久影视 | 黄毛片在线观看 | 成人在线一区二区 | 人人看人人爱 | 久久久精品在线观看 | 免费日韩一级片 | 国产精彩在线视频 | 免费在线激情电影 | 久久免费黄色网址 | 精品久久综合 | 99久久精品国产免费看不卡 | 精品av在线播放 | 久草视频一区 | 91精品在线观看入口 | 日韩 在线| 亚洲国产午夜视频 | 亚洲在线精品 | 日韩欧美精品在线视频 | 九九热在线观看 | 中文字幕不卡在线88 | 一本色道久久精品 | 麻豆久久精品 | 欧美另类高清 videos | 丁香六月激情婷婷 | 欧美日韩精品在线播放 | 国产精品久久久久久久久免费 | 亚洲va欧美va | 色播五月激情五月 | 婷婷六月中文字幕 | 在线观看黄色大片 | 日本三级香港三级人妇99 | 成人影片在线免费观看 | 国产日韩欧美在线播放 | 婷婷午夜激情 | 美女啪啪图片 | 欧美午夜寂寞影院 | 欧美精品亚洲精品 | 成人在线你懂得 | 波多野结衣精品视频 | 欧美精品免费视频 | 精品国精品自拍自在线 | 5月丁香婷婷综合 | 黄在线免费观看 | 日本婷婷色 | 麻豆视频免费在线播放 | 国产精品99久久久久人中文网介绍 | 日本特黄特色aaa大片免费 | 69成人在线 | 在线午夜电影神马影院 | 黄色av免费电影 | 久久a免费视频 | 91在线看黄| 91av在线精品 | 日本aaa在线观看 | 天天干天天操天天 | 色网站中文字幕 | 日韩精品中文字幕在线观看 | 久久久久一区 | 久久综合精品国产一区二区三区 | 免费久久99精品国产 | 成人黄色片在线播放 | 国产中文字幕视频在线观看 | 国产免费午夜 | 久久久久久久免费观看 | 人人天天夜夜 | 日韩免费看视频 | 欧美99久久 | 97视频在线免费观看 | www.五月婷婷 | 久久av免费 | 免费观看国产精品视频 | 欧美精品一区二区蜜臀亚洲 | 日日夜夜操操操操 | 天天干天天搞天天射 | 久久人人爽爽 | 国产成人在线观看免费 | 国产高清av在线播放 | 又色又爽又黄高潮的免费视频 | 日韩午夜电影 | 欧美三级高清 | 麻豆小视频在线观看 | 中文字幕在线观看免费观看 | 亚洲免费在线视频 | 精品你懂的 | 91九色porn在线资源 | 毛片激情永久免费 | 久久ww| www视频在线免费观看 | 亚洲精品ww | 永久免费精品视频 | 精品在线观看一区二区 | 亚州天堂| 色婷婷视频在线 | 一区 二区 精品 | 一级片免费视频 | 免费一级片在线观看 | 在线免费观看黄 | 久久视奸| 中文字幕高清 | 亚洲国产网址 | 国产区精品 | 免费在线观看视频一区 | 一区二区三区三区在线 | 超碰在线1 | 人人射人人插 | 精品亚洲成a人在线观看 | 91精品第一页 | 在线观看日韩国产 | 欧美精彩视频在线观看 | 免费在线观看成人小视频 | 亚洲黄电影 | 在线观看国产成人av片 | 国产精品手机在线观看 | 午夜av电影| 精品亚洲欧美一区 | 欧美日韩国产在线 | 色av男人的天堂免费在线 | 久久官网 | www日日夜夜 | 欧美日韩网址 | 亚洲老妇xxxxxx | 成人av网站在线观看 | 国产盗摄精品一区二区 | 国产韩国精品一区二区三区 | 首页国产精品 | 国产精成人品免费观看 | 正在播放国产精品 | 五月天电影免费在线观看一区 | 美女网站视频色 | 激情av资源网| 九九影视理伦片 | 激情网五月天 | 久久国产精品色av免费看 | 日本成人免费在线观看 | 午夜精品久久久久 | 99r国产精品| 蜜桃视频在线观看一区 | 久久精品一区二区三 | 一级成人网 | 亚洲免费观看在线视频 | 国产午夜在线观看 | 午夜视频在线观看一区二区三区 | 亚洲免费国产视频 | 国产精品99久久久久的智能播放 | 中文字幕乱码电影 | 久久96国产精品久久99软件 | 久久九九影院 | 日韩亚洲在线观看 | 西西44人体做爰大胆视频 | 国产高清免费av | 色综合久久66| 国产福利资源 | 日韩中文字幕免费看 | 免费高清国产 | 欧美大片mv免费 | av色综合| 麻豆传媒电影在线观看 | 国产精品一区二区电影 | 欧美伦理一区 | se视频网址| 91福利国产在线观看 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 国产精品资源在线 | 久久成人视屏 | 久久影视一区二区 | 久草在线免费电影 | av福利在线免费观看 | 国产精品久久久久久久7电影 | 91成人免费看 | 国内精品久久久久影院日本资源 | 亚洲精品免费播放 | 国产精品欧美久久久久久 | 能在线观看的日韩av | 国产精品99精品久久免费 | 国产精品久久久久久久久久三级 | 日韩1级片| 精久久久久 | 夜夜操天天干, | 91精品视频播放 | 亚洲精品免费观看视频 | 婷婷综合导航 | 99久久99热这里只有精品 | 97成人在线视频 | 在线а√天堂中文官网 | 久草在线播放视频 | 久久久国产精品一区二区三区 | www.xxxx变态.com| 成人午夜精品 | 91视频 - 114av| 超级碰碰碰视频 | 日本公妇在线观看高清 | 日韩精品免费在线 | 精品国产精品一区二区夜夜嗨 | 99视频久久 | 91桃色国产在线播放 | 中文字幕一区二区在线播放 | 久久综合久久综合这里只有精品 | 美女网站视频免费都是黄 | 欧美在线视频一区二区三区 | 免费在线播放 | 美女精品久久 | 午夜久久视频 | 亚洲第一区精品 | 在线网址你懂得 | 国产一级视频在线免费观看 | 中文乱码视频在线观看 | 色94色欧美| 视频二区在线视频 | 久久极品 | av在线短片 | 国产精品久久久久久久电影 | 狂野欧美激情性xxxx | 三级黄色片在线观看 | 精品久久久久久亚洲综合网 | 国产一区二区免费在线观看 | 精品国产一区二区三区蜜臀 | 人人超碰97| 国产精品永久在线 | 亚洲日本成人网 | 午夜精品一区二区三区在线播放 | 国精产品999国精产品视频 | 久久国产精品免费看 | av网站手机在线观看 | 欧美 日韩精品 | 久久综合久久综合九色 | 欧美巨乳网| 欧美xxxxx在线视频 | 日韩欧美在线影院 | 欧美一区二区三区在线看 | 综合在线色 | 亚洲日日夜夜 | 欧美久久久久久久久久久 | 国产成人在线免费观看 | 日日干狠狠操 | 免费看一级特黄a大片 | 手机看片国产日韩 | 天天色天天综合网 | 久久国精品 | 日韩欧美精品在线观看 | 91av小视频| 国产视频日本 | 成人在线免费视频观看 | 国产精品区一区 | 久久免费视频观看 | 国产玖玖精品视频 | 超碰免费在线公开 | 欧美热久久 | 日本在线中文在线 | 国产69久久久 | 黄色三级免费观看 | 丝袜美腿亚洲 | 国产精品综合在线观看 | av线上看 | 亚洲精品一区二区三区高潮 | 亚洲精品婷婷 | 午夜在线免费观看视频 | 91爱爱电影 | 黄色av网站在线观看 | 久久久久久久久久免费 | 中文字幕在线字幕中文 | 国产乱对白刺激视频在线观看女王 | 麻豆传媒视频在线 | 96国产精品 | 五月婷在线观看 | 色免费在线 | 国产资源av| 欧美另类调教 | 在线观看国产 | 国产精品第一 | 精品一区二区三区四区在线 | 国产视频 亚洲视频 | h网站免费在线观看 | 在线看国产一区 | 五月婷婷中文网 | 国产精品久久免费看 | 久久国产午夜精品理论片最新版本 | 伊人亚洲精品 | 欧美日本不卡视频 | 很黄很黄的网站免费的 | av久久久| 亚洲成人资源在线观看 | 外国av网| 啪啪资源 | 色网站免费在线看 | 久久av网| 美女视频国产 | 五月婷婷开心中文字幕 | 日韩av线观看 | 欧美日韩一区二区在线观看 | 国产精品va最新国产精品视频 | 午夜久久成人 | 久久精品播放 | 视频在线观看国产 | 一区在线电影 | 日韩精品一区二区在线观看 | 五月综合婷 | 精品国产乱码久久久久久浪潮 | 日韩精品在线观看视频 | 久久美女视频 | 国产精品久久久久久久久软件 | 黄色小说免费观看 | 国产美女被啪进深处喷白浆视频 | 五月婷婷亚洲 | 国产手机在线播放 | 免费在线成人 | 一二三区视频在线 | 高清中文字幕av | 九九热只有精品 | 久久久久久久久久久高潮一区二区 | 免费三级黄 | 一本一本久久a久久精品牛牛影视 | 亚洲人成人在线 | 九九热在线精品视频 | 日韩色一区二区三区 | 亚洲午夜久久久久久久久电影网 | 在线电影中文字幕 | 久久免费高清视频 | 国产精品一二 | 97影视| 在线看国产日韩 | 亚洲精品国产自产拍在线观看 | 中文字幕中文字幕在线中文字幕三区 | 在线91色 | 91成熟丰满女人少妇 | 久久视频在线视频 | 92中文资源在线 | 视频在线观看入口黄最新永久免费国产 | 国产精品视频99 | 狠狠狠狠狠狠操 | 欧美午夜精品久久久久久浪潮 | 热久精品 | 日本最新中文字幕 | 欧美一级久久久久 | 亚洲精品自拍视频在线观看 | 99久久精品免费看国产四区 | 四虎伊人| 久久免费观看视频 | 蜜桃av人人夜夜澡人人爽 | 久久综合一本 | 国产精品一区二区白浆 | 婷婷久久一区二区三区 | 久久人人看 | 成人黄色电影在线观看 | 搡bbbb搡bbb视频 | 国产精品白浆视频 | 射射射综合网 | 国产99re| 一级片视频免费观看 | 日韩精品在线视频免费观看 | 精品麻豆入口免费 | 国产99久久久精品 | 久久综合久久综合久久综合 | 99亚洲天堂| 久在线观看视频 | 久久66热这里只有精品 | 成人亚洲免费 | 免费观看午夜视频 | 日本最新中文字幕 | 少妇高潮流白浆在线观看 | 人人爽夜夜爽 | 国产在线观看免费 | 五月婷婷色播 | 久久一区91 | 欧美极品久久 | 99精品视频免费在线观看 | 狠狠色丁香九九婷婷综合五月 | 久久免费视频这里只有精品 | 天天操天天射天天操 | 91福利专区 | 一区二区视频播放 | 国产传媒一区在线 | 日韩在线电影观看 | 黄色三级免费看 | 狠狠狠色狠狠色综合 | 免费日韩一区二区三区 | 欧美一级免费高清 | 丁香婷婷自拍 | 99爱在线观看 | 久久婷婷综合激情 | 91亚洲成人 | 久久国产福利 | av在线播放不卡 | 国产黄色精品在线 | 91精品久久香蕉国产线看观看 | a一片一级 | 久久国产一区二区三区 | 婷婷色综合色 | 亚洲精品一区二区18漫画 | 女人18精品一区二区三区 | 在线观看视频你懂 | 99久久久国产免费 | 久久人人97超碰精品888 | 日韩在线视频一区二区三区 | 久草成人在线 | 国产99在线免费 | 日韩视频一区二区三区在线播放免费观看 | 欧美久久久久久久久久久久久 | 97在线免费观看 | 国产丝袜在线 | 亚洲综合视频在线 | 91天堂在线观看 | 亚洲国产偷 | 欧美一级视频免费看 | 国产成人精品电影久久久 | 综合婷婷丁香 | 最新中文字幕视频 | 成人小电影在线看 | 成全免费观看视频 | 国产精品欧美久久 | 亚洲午夜精品电影 | 国产亚洲成av片在线观看 | 国产一区二区三区在线免费观看 | 中文字幕在线观看免费高清完整版 | 久久久久久久久久国产精品 | 444av| 国产精久久久 | 亚洲国产精品一区二区久久hs | 久久久电影网站 | 久草精品在线播放 | 精品一区 精品二区 | 福利电影一区二区 | 国产一区二区手机在线观看 | 国产亚洲激情视频在线 | 麻豆成人精品视频 | 国产精品原创视频 | 中文字幕在线观看网址 | 黄色三级在线看 | 激情视频91 | www.天天成人国产电影 | 中文永久免费观看 | 国产精品精品国产婷婷这里av | www.精选视频.com| 综合激情av | 天天久久综合 | 午夜视频在线瓜伦 | 中文字幕av日韩 | 成人精品福利 | 国产大片黄色 | av免费线看 | 人人添人人澡 | 精品视频123区在线观看 | 亚洲综合在线一区二区三区 | 国产热re99久久6国产精品 | 日批视频在线播放 | 欧美激情精品久久久久久免费印度 | 午夜久久久久久久久久久 | 在线精品亚洲 | 在线观看亚洲视频 | 特级免费毛片 | 91成人亚洲 | 亚洲免费av网站 | 国产日韩在线播放 | 国产精品久久久久久999 | 国产高清视频在线观看 | 人人插人人艹 | 黄色一级大片在线观看 | 在线影视 一区 二区 三区 | 日韩精品不卡在线观看 | 天天操天天爽天天干 | 免费视频97| 深爱婷婷网 | 美女视频黄免费 | 色婷婷视频在线 | 久久视频在线观看 | 999ZYZ玖玖资源站永久 | 日韩免费视频线观看 | 黄色日视频 | 亚洲综合欧美激情 | 国产在线观看免费观看 | 欧美成人区| 日韩深夜在线观看 | 香蕉视频一级 | 欧美黄在线 | 日本久久久久久久久久 | 中文字幕在线观看网站 | 亚洲另类在线视频 | 色吧久久 | 久久久久女人精品毛片九一 | 日本爽妇网| 欧美激情精品久久久久久变态 | 狠狠色丁香婷婷综合久小说久 | 最近中文字幕免费观看 | 人人玩人人添人人澡超碰 | 四虎国产精品成人免费4hu | 91亚洲网站 | 在线视频福利 | 久草久视频 | 色.www | 在线 视频 一区二区 | 91网在线看 | 91亚洲欧美 | 亚洲免费成人 | 成人午夜在线电影 | a级国产乱理论片在线观看 特级毛片在线观看 | 欧美国产在线看 | 2023国产精品自产拍在线观看 | 国外调教视频网站 | 一级黄色免费网站 | 久久免费国产视频 | 人人精久 | 精品久久久久久亚洲 | 女人18片 | 伊人亚洲综合网 | 天天玩夜夜操 | 久久久久久久久免费视频 | 久久日韩精品 | 精品资源在线 | 色婷婷狠狠五月综合天色拍 | 久色小说 | 天天操天天摸天天爽 |