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

iOS中block介紹(四)揭開神秘面紗(下)

移動開發 iOS
終于有空開始這系列最后一篇的編寫。這一篇,我們將看到block的內存管理的內部實現,通過剖析runtime庫源碼,我們可以更深刻的理解block的內存運作體系。

看此篇時,請大家同時打開兩個網址(或者下載它們到本地然后打開):

http://llvm.org/svn/llvm-project/compiler-rt/trunk/BlocksRuntime/runtime.c

http://llvm.org/svn/llvm-project/compiler-rt/trunk/BlocksRuntime/Block_private.h

內存管理的真面目

objc層面如何區分不同內存區的block

Block_private.h中有這樣一組值:

  1. /* the raw data space for runtime classes for blocks */ 
  2. /* class+meta used for stack, malloc, and collectable based blocks */ 
  3. BLOCK_EXPORT void * _NSConcreteStackBlock[32]; 
  4. BLOCK_EXPORT void * _NSConcreteMallocBlock[32]; 
  5. BLOCK_EXPORT void * _NSConcreteAutoBlock[32]; 
  6. BLOCK_EXPORT void * _NSConcreteFinalizingBlock[32]; 
  7. BLOCK_EXPORT void * _NSConcreteGlobalBlock[32]; 
  8. BLOCK_EXPORT void * _NSConcreteWeakBlockVariable[32]; 

其用于對block的isa指針賦值

1.棧

  1. struct __OBJ1__of2_block_impl_0 { 
  2.   struct __block_impl impl; 
  3.   struct __OBJ1__of2_block_desc_0* Desc; 
  4.   OBJ1 *self; 
  5.   __OBJ1__of2_block_impl_0(void *fp, struct __OBJ1__of2_block_desc_0 *desc, OBJ1 *_self, int flags=0) : self(_self) { 
  6.     impl.isa = &_NSConcreteStackBlock; 
  7.     impl.Flags = flags; 
  8.     impl.FuncPtr = fp; 
  9.     Desc = desc; 
  10.   } 
  11. }; 

在棧上創建的block,其isa指針是_NSConcreteStackBlock。

2.全局區

在全局區創建的block,其比較類似,其構造函數會將isa指針賦值為_NSConcreteGlobalBlock。

3.堆

我們無法直接創建堆上的block,堆上的block需要從stack block拷貝得來,在runtime.c中的_Block_copy_internal函數中,有這樣幾行:

  1. // Its a stack block.  Make a copy. 
  2.     if (!isGC) { 
  3.         struct Block_layout *result = malloc(aBlock->descriptor->size); 
  4.         ... 
  5.         result->isa = _NSConcreteMallocBlock; 
  6.         ... 
  7.         return result; 
  8.     } 

可以看到,棧block復制得來的新block,其isa指針會被賦值為_NSConcreteMallocBlock

4.其余的isa類型

  1. BLOCK_EXPORT void * _NSConcreteAutoBlock[32]; 
  2. BLOCK_EXPORT void * _NSConcreteFinalizingBlock[32]; 
  3. BLOCK_EXPORT void * _NSConcreteWeakBlockVariable[32]; 

其他三種類型是用于gc和arc,我們暫不討論

復制block

 對block調用Block_copy方法,或者向其發送objc copy消息,最終都會調用runtime.c中的_Block_copy_internal函數,其內部實現會檢查block的flag,從而進行不同的操作:

  1. static void *_Block_copy_internal(const void *arg, const int flags) { 
  2.     ... 
  3.     aBlock = (struct Block_layout *)arg; 
  4.     ... 
  5. }1.棧block的復制 
  6.  
  7.         // reset refcount 
  8.         result->flags &= ~(BLOCK_REFCOUNT_MASK);    // XXX not needed 
  9.         result->flags |= BLOCK_NEEDS_FREE | 1; 
  10.         result->isa = _NSConcreteMallocBlock; 
  11.         if (result->flags & BLOCK_HAS_COPY_DISPOSE) { 
  12.             //printf("calling block copy helper %p(%p, %p)...\n", aBlock->descriptor->copy, result, aBlock); 
  13.             (*aBlock->descriptor->copy)(result, aBlock); // do fixup 
  14.         } 

 除了修改isa指針的值之外,拷貝過程中,還會將BLOCK_NEEDS_FREE置入,大家記住這個值,后面會用到。

***,如果block有輔助copy/dispose函數,那么輔助的copy函數會被調用。

2.全局block的復制

  1. else if (aBlock->flags & BLOCK_IS_GLOBAL) { 
  2.         return aBlock; 
  3.     }全局block進行copy是直接返回了原block,沒有任何的其他操作。

全局block進行copy是直接返回了原block,沒有任何的其他操作。

3.堆block的復制

  1. if (aBlock->flags & BLOCK_NEEDS_FREE) { 
  2.     // latches on high 
  3.     latching_incr_int(&aBlock->flags); 
  4.     return aBlock; 

棧block復制時,置入的BLOCK_NEEDS_FREE標記此時起作用,_Block_copy_internal函數識別當前block是一個堆block,則僅僅增加引用計數,然后返回原block。

輔助copy/dispose函數

1.普通變量的復制

輔助copy函數用于拷貝block所引用的可修改變量,我們這里以 __block int i = 1024為例:

先看看Block_private.h中的定義:

  1. struct Block_byref { 
  2.     void *isa; 
  3.     struct Block_byref *forwarding; 
  4.     int flags; /* refcount; */ 
  5.     int size; 
  6.     void (*byref_keep)(struct Block_byref *dst, struct Block_byref *src); 
  7.     void (*byref_destroy)(struct Block_byref *); 
  8.     /* long shared[0]; */ 
  9. }; 

而我們的__block int i = 1024的轉碼:

  1. struct __Block_byref_i_0 { 
  2.   void *__isa; 
  3. __Block_byref_i_0 *__forwarding; 
  4.  int __flags; 
  5.  int __size; 
  6.  int i; 
  7. };//所以我們知道,當此結構體被類型強轉為Block_byref時,前四個成員是一致的,訪問flags就相當于訪問__flags,而內部實現就是這樣使用的 
  8. ... 
  9. __attribute__((__blocks__(byref))) __Block_byref_i_0 i = {(void*)0,(__Block_byref_i_0 *)&i, 0, sizeof(__Block_byref_i_0), 1024};//i初始化時__flags為0static void __main_block_copy_0(struct __main_block_impl_0*dst, struct __main_block_impl_0*src) {_Block_object_assign((void*)&dst->i, (void*)src->i, 8/*BLOCK_FIELD_IS_BYREF*/);} 

此時,復制時調用的輔助函數:

  1. void _Block_object_assign(void *destAddr, const void *object, const int flags) {//此處flags為8,即BLOCK_FIELD_IS_BYREF 
  2.     ... 
  3.     if ((flags & BLOCK_FIELD_IS_BYREF) == BLOCK_FIELD_IS_BYREF)  { 
  4.         // copying a __block reference from the stack Block to the heap 
  5.         // flags will indicate if it holds a __weak reference and needs a special isa 
  6.         _Block_byref_assign_copy(destAddr, object, flags); 
  7.     } 
  8.     ... 
  9.  
  10. static void _Block_byref_assign_copy(void *dest, const void *arg, const int flags) {//此處flags為8,即BLOCK_FIELD_IS_BYREF 
  11.     struct Block_byref **destp = (struct Block_byref **)dest; 
  12.     struct Block_byref *src = (struct Block_byref *)arg; 
  13.     ... 
  14.     else if ((src->forwarding->flags & BLOCK_REFCOUNT_MASK) == 0) {//當初次拷貝i時,flags為0,進入此分支會進行復制操作并改變flags值,置入BLOCK_NEEDS_FREE和初始的引用計數 
  15.        ... 
  16.     } 
  17.     // already copied to heap 
  18.     else if ((src->forwarding->flags & BLOCK_NEEDS_FREE) == BLOCK_NEEDS_FREE) {//當再次拷貝i時,則僅僅增加其引用計數 
  19.         latching_incr_int(&src->forwarding->flags); 
  20.     } 
  21.     // assign byref data block pointer into new Block 
  22.     _Block_assign(src->forwarding, (void **)destp);//這句僅僅是直接賦值,其函數實現只有一行賦值語句,查閱runtime.c可知 

所以,我們知道,當我們多次copy一個block時,其引用的__block變量只會被拷貝一次。

2.objc變量的復制 

當objc變量沒有__block修飾時:

  1. static void __OBJ1__of2_block_copy_0(struct __OBJ1__of2_block_impl_0*dst, struct __OBJ1__of2_block_impl_0*src) {_Block_object_assign((void*)&dst->self, (void*)src->self, 3/*BLOCK_FIELD_IS_OBJECT*/);}void _Block_object_assign(void *destAddr, const void *object, const int flags) { 
  2.     ... 
  3.     else if ((flags & BLOCK_FIELD_IS_OBJECT) == BLOCK_FIELD_IS_OBJECT) { 
  4.         //printf("retaining object at %p\n", object); 
  5.         _Block_retain_object(object);//當我們沒有開啟arc時,這個函數會retian此object 
  6.         //printf("done retaining object at %p\n", object); 
  7.         _Block_assign((void *)object, destAddr); 
  8.     } 
  9.     .... 

當objc變量有__block修飾時:

  1. struct __Block_byref_bSelf_0 { 
  2.   void *__isa; 
  3. __Block_byref_bSelf_0 *__forwarding; 
  4.  int __flags; 
  5.  int __size; 
  6.  void (*__Block_byref_id_object_copy)(void*, void*); 
  7.  void (*__Block_byref_id_object_dispose)(void*); 
  8.  OBJ1 *bSelf; 
  9. }; 
  10. static void __Block_byref_id_object_copy_131(void *dst, void *src) { 
  11.  _Block_object_assign((char*)dst + 40, *(void * *) ((char*)src + 40), 131);//131即為BLOCK_FIELD_IS_OBJECT|BLOCK_BYREF_CALLER 
  12. static void __Block_byref_id_object_dispose_131(void *src) { 
  13.  _Block_object_dispose(*(void * *) ((char*)src + 40), 131); 
  14.   
  15. ... //33554432即為BLOCK_HAS_COPY_DISPOSE 
  16.     __block __Block_byref_bSelf_0 bSelf = {(void*)0,(__Block_byref_bSelf_0 *)&bSelf, 33554432, sizeof(__Block_byref_bSelf_0), __Block_byref_id_object_copy_131, __Block_byref_id_object_dispose_131, self}; 

BLOCK_HAS_COPY_DISPOSE告訴內部實現,這個變量結構體具有自己的copy/dispose輔助函數,而此時我們的內部實現不會進行默認的復制操作:

  1. void _Block_object_assign(void *destAddr, const void *object, const int flags) { 
  2.     //printf("_Block_object_assign(*%p, %p, %x)\n", destAddr, object, flags); 
  3.     if ((flags & BLOCK_BYREF_CALLER) == BLOCK_BYREF_CALLER) { 
  4.         if ((flags & BLOCK_FIELD_IS_WEAK) == BLOCK_FIELD_IS_WEAK) { 
  5.             _Block_assign_weak(object, destAddr); 
  6.         } 
  7.         else { 
  8.             // do *not* retain or *copy* __block variables whatever they are 
  9.             _Block_assign((void *)object, destAddr); 
  10.         } 
  11.     } 

當我們沒有開啟arc,且flags中具有BLOCK_BYREF_CALLER時,會進入_Block_assign函數,而此函數僅僅是賦值

所以,如果要避免objc實例中的block引起的循環引用,我們需要讓block間接使用self:

__block bSelf = self;

其他

對于dipose輔助函數,其行為與copy是類似的,我們不再重復同樣的東西,如果大家要了解,自行查閱runtime.c和Block_private.h即可。

我們已經理解了非arc非gc情況下的block的內存管理內部實現,對arc和gc的情況,其行為也是類似的,只是一些函數的指針指向的真正函數會改變,比如_Block_use_GC函數,會將一些函數指向其他的實現,使其適用于gc開啟的情況。

小結

block實際上是一些執行語句和語句需要的上下文的組合,而runtime給予的內部實現決定了它不會浪費一比特的內存。

我們知道cocoa中的容器類class有mutable和immutable之分,實際上我們可以將block看做一個immutable的容器,其盛放的是執行的代碼和執行此代碼需要的變量,而一個immutable變量的無法改變的特質,也決定了block在復制時,的確沒有必要不斷分配新的內存。故而其復制的行為會是增加引用計數。

責任編輯:閆佳明 來源: dreamingwish
相關推薦

2013-07-19 14:00:13

iOS中BlockiOS開發學習

2015-08-20 13:43:17

NFV網絡功能虛擬化

2015-09-08 10:06:15

2010-05-26 19:12:41

SVN沖突

2021-07-28 21:49:01

JVM對象內存

2014-03-12 11:11:39

Storage vMo虛擬機

2021-06-07 08:18:12

云計算云端阿里云

2010-05-17 09:13:35

2009-09-15 15:34:33

Google Fast

2016-04-06 09:27:10

runtime解密學習

2023-11-02 09:55:40

2018-03-01 09:33:05

軟件定義存儲

2010-05-11 10:19:17

VMforceJava云計算

2009-06-01 09:04:44

Google WaveWeb

2021-09-17 15:54:41

深度學習機器學習人工智能

2010-09-17 14:57:34

JAVA數據類型

2020-04-14 10:44:01

區塊鏈滲透測試比特幣

2010-06-17 10:53:25

桌面虛擬化

2017-10-16 05:56:00

2011-08-02 08:59:53

點贊
收藏

51CTO技術棧公眾號

欧美丝袜美女中出在线| 国产综合色视频| 精品亚洲一区二区三区在线播放| 激情六月丁香婷婷| 在线观看精品一区二区三区| 久久99精品久久久久久国产越南 | 亚洲永久无码7777kkk| 桃色一区二区| 亚洲激情图片小说视频| 久久99精品久久久久久三级 | 欧美一卡二卡在线观看| www插插插无码视频网站| 国产黄色片在线观看| 国产精品一区二区久久不卡| 欧美在线视频一区二区| 青娱乐国产盛宴| 亚洲精品一级二级三级| 91麻豆精品国产91久久久使用方法 | 亚洲国产美国国产综合一区二区| 日本午夜精品一区二区| 亚洲国产精品久久久久爰性色| 小嫩嫩精品导航| 欧美激情a在线| 国产主播av在线| 午夜a一级毛片亚洲欧洲| 日韩一二三区不卡| 亚洲免费999| 中文字幕在线直播| 伊人一区二区三区| 一区二区冒白浆视频| 久久精品蜜桃| 成人丝袜高跟foot| 成人精品福利视频| 91porny九色| 日韩一级在线| 国模叶桐国产精品一区| 五月天婷婷色综合| 99久久婷婷| 中文字幕久热精品在线视频| 亚洲av无码国产精品久久| 亚洲一区二区三区日本久久九| 在线精品视频一区二区三四| 国产精品免费观看久久| av在线不卡免费| 亚洲综合一区二区| 久久久久久久9| www红色一片_亚洲成a人片在线观看_| 国产精品国产自产拍高清av王其| 奇米影视首页 狠狠色丁香婷婷久久综合| 亚洲精品一区二区三区四区| 国产精品一二三| 91欧美精品成人综合在线观看| 一级爱爱免费视频| 美女视频网站久久| 成人av在线网址| 91精品人妻一区二区三区果冻| 麻豆成人91精品二区三区| 国产福利视频一区二区| 超碰在线观看91| 全部av―极品视觉盛宴亚洲| 国产精品人成电影在线观看| 在线视频1卡二卡三卡| 毛片av一区二区| 国产综合福利在线| 精品人妻一区二区三区日产乱码| 国产精品夜夜嗨| 国产成人免费电影| 午夜国产在线观看| 久久精品夜夜夜夜久久| 日韩在线第一区| 91caoporn在线| 国产精品盗摄一区二区三区| 2021狠狠干| av在线最新| 91成人在线精品| 尤物国产在线观看| 亚洲精品国产九九九| 日韩精品在线电影| 91成人精品一区二区| 一区二区日韩欧美| 91精品国产91久久| 中日精品一色哟哟| 国产精品亚洲成人| 久久青青草综合| 色多多视频在线观看| 一区二区三区久久久| 日本精品一区二区三区四区| 日韩国产一二三区| 精品国产百合女同互慰| av网站免费在线看| 亚洲一区 二区 三区| 性欧美xxxx交| 亚洲一级在线播放| 成人久久久精品乱码一区二区三区| 久久国产精品99久久久久久丝袜 | 久久九九99视频| 香蕉视频在线网址| 无遮挡爽大片在线观看视频| 成年人免费看毛片| 老司机精品视频一区二区三区| 亚洲free嫩bbb| 久久久久久久影视| 夜夜爽夜夜爽精品视频| 午夜免费一区二区| 成人精品动漫一区二区三区| 国产一区二区三区在线看| 欧美日韩三级在线观看| 日韩精品欧美成人高清一区二区| 91九色在线免费视频| 免费国产在线视频| 亚洲电影第三页| 亚洲午夜精品一区| 国产一区二区亚洲| 韩国精品久久久999| 国产又黄又粗又长| 久久午夜羞羞影院免费观看| 日韩视频 中文字幕| 成人日韩av| 国产视频一区在线| 久久老司机精品视频| 久久 天天综合| 欧美日韩综合网| 2021天堂中文幕一二区在线观| 欧美剧情电影在线观看完整版免费励志电影 | 狠狠色综合日日| 日韩影视精品| 欧美色999| 亚洲精品一区二区三区不| 国产一级视频在线| 国产精品一二三在| 中文字幕剧情在线观看一区| 九九九伊在线综合永久| 精品亚洲一区二区三区在线播放 | 欧美主播一区二区三区| 大地资源二中文在线影视观看| 欧美日韩成人| 91久久精品www人人做人人爽| 三区四区在线视频| 欧美日韩中文字幕精品| 免费黄色在线网址| 日本视频一区二区| 日产中文字幕在线精品一区| 在线天堂新版最新版在线8| 亚洲电影免费观看高清| 日本三级午夜理伦三级三| 国产成人午夜视频| 日本美女爱爱视频| 亚洲一区电影| 韩国19禁主播vip福利视频| 成人毛片视频免费看| 亚洲无人区一区| 精品国产人妻一区二区三区| 亚洲国产99| 国产一区再线| 午夜欧美激情| 亚洲性日韩精品一区二区| www.久久精品视频| 国产精品网站在线播放| 午夜激情影院在线观看| 夜间精品视频| 国产精品乱码视频| 美女的胸无遮挡在线观看| 亚洲精品国产精品国产自| 综合激情网五月| 国产三级久久久| 91高清国产视频| 欧美精品大片| 精品国产乱码久久久久久久软件 | 色综合天天天天做夜夜夜夜做| 级毛片内射视频| 久久精品国产亚洲高清剧情介绍 | 欧美一区二区在线不卡| 久久丫精品久久丫| 91麻豆.com| 岛国毛片在线播放| 欧美日韩1区2区3区| 美乳视频一区二区| 亚州精品国产| 久久久久久亚洲精品不卡| 欧美在线一卡| 8x8x8国产精品| 日本熟女一区二区| 国产午夜精品一区二区三区嫩草| 成人黄色一级大片| 日韩一区二区久久| 亚洲一二区在线| 超碰成人免费| 国产精品欧美日韩| 国产啊啊啊视频在线观看| 亚洲欧美日韩精品久久亚洲区| 在线观看毛片视频| 亚洲二区在线视频| www.日本高清视频| 成人高清av在线| 亚洲老女人av| 日韩视频三区| www亚洲国产| 亚洲高清极品| 97操在线视频| 777午夜精品电影免费看| 九九热这里只有精品6| 国产一二在线观看| 精品国产在天天线2019| 综合久久中文字幕| 五月综合激情网| 极品魔鬼身材女神啪啪精品| 26uuu亚洲综合色| 一个人看的视频www| 日韩一区精品字幕| 久久视频这里有精品| 综合激情一区| 日韩视频精品| 亚洲欧美tv| 国产精品一区在线播放| 高清不卡一区| 国产美女精品视频免费观看| 手机在线观看av| 欧美国产日韩一区二区三区| 日本欧美在线视频免费观看| 亚洲欧美日韩直播| 欧美性猛交 xxxx| 日韩一区二区精品葵司在线| 最近中文字幕在线观看| 欧美丝袜美女中出在线| 日韩精品在线不卡| 亚洲精品老司机| 欧美一区免费观看| 国产精品天美传媒沈樵| 伊人网伊人影院| 99riav一区二区三区| 日本在线不卡一区二区| 福利一区二区在线| 欧美一级片在线免费观看| 国产一区二区三区久久久| 高清av免费看| 久久精品国产免费看久久精品| 日本男人操女人| 乱码第一页成人| 粉嫩虎白女毛片人体| 免费在线观看成人av| 香港三级韩国三级日本三级| 亚洲国产高清一区二区三区| av网站手机在线观看| 亚洲调教视频在线观看| 欧美日韩视频免费| 韩国一区二区三区在线观看| 17c丨国产丨精品视频| 国产一区二区中文| 欧美综合在线播放| 国产九九精品| 一本久道综合色婷婷五月| 水蜜桃久久夜色精品一区的特点 | 超碰成人在线免费观看| 婷婷另类小说| 成年在线观看视频| 亚洲国产影院| 青青在线视频观看| 日本一不卡视频| 超碰在线资源站| 国产成人在线电影| 亚洲熟女一区二区| 久久久久综合网| 99久久99久久精品免费看小说.| 国产精品成人午夜| 久久久精品99| 欧美性猛交xxxx免费看漫画| 国产成人自拍偷拍| 欧美另类高清zo欧美| 亚洲国产精品久久久久爰性色| 日韩成人在线免费观看| 毛片免费在线观看| 久久精品在线播放| jizzjizz中国精品麻豆| 日韩av片免费在线观看| 欧美成人家庭影院| 成人av网站观看| 久久91麻豆精品一区| 一本久道久久综合| 在线日韩av| 天天干天天操天天玩| 丁香亚洲综合激情啪啪综合| 精品少妇一区二区三区免费观| 国产精品乱码一区二三区小蝌蚪| 中文字幕av免费在线观看| 欧美性xxxxx极品| 一级片视频免费| 亚洲第一视频在线观看| 天堂资源在线中文| 午夜精品久久久久久久久久久久| 99久久综合国产精品二区| 91免费版黄色| 精品久久一区| 欧美大黑帍在线播放| 可以免费看不卡的av网站| av地址在线观看| 国产欧美精品日韩区二区麻豆天美| 私库av在线播放| 欧美亚洲国产bt| 乱精品一区字幕二区| 最新国产成人av网站网址麻豆| 91高清视频在线观看| 国产欧美日韩专区发布| 亚洲都市激情| 亚洲 欧美 综合 另类 中字| 久久99热99| 天天躁日日躁aaaxxⅹ| 亚洲午夜精品网| 国产精品久久777777换脸| 亚洲男子天堂网| 黑人玩欧美人三根一起进| 国产在线日韩在线| 红桃视频在线观看一区二区| 免费av观看网址| 国产精品亚洲专一区二区三区| 刘亦菲国产毛片bd| 一本大道av一区二区在线播放| 亚洲伦理在线观看| 伊人情人综合网| 欧美黑人xxxⅹ高潮交| 国产精品原创视频| 久久久久久草| 亚洲三级网站| aaa黄色大片| 亚洲精品大片www| 国产精品久久久久久久久久久久久久久久久久| 亚洲欧美制服丝袜| 中文在线а√天堂| 精品一区二区久久久久久久网站| 欧美 日韩 国产精品免费观看| 午夜视频在线网站| 国产精品久久久久久久久图文区 | 欧美一级艳片视频免费观看| av电影在线观看| 国产精品国产亚洲伊人久久| 综合国产视频| 欧美黄色免费影院| 91麻豆精东视频| 青青国产在线观看| 日韩成人中文字幕在线观看| 俺来也官网欧美久久精品| 国产精品久久7| 自拍偷拍欧美| 年下总裁被打光屁股sp | 久久女同精品一区二区| av大片在线免费观看| 亚洲精品一区中文| 国产高清不卡| 日韩欧美精品久久| 免费高清在线一区| 欧美一级特黄高清视频| 777精品伊人久久久久大香线蕉| 日本韩国在线视频爽| 91免费在线视频| 亚洲网站视频| 天天插天天射天天干| 色综合欧美在线| aiai在线| 91九色综合久久| 欧美精品aa| 37p粉嫩大胆色噜噜噜| 色婷婷国产精品| 国产在线免费观看| 国产精品尤物福利片在线观看| 天天操夜夜操国产精品| 亚洲av综合色区无码另类小说| 亚洲成人免费av| 欧洲毛片在线| 成人情趣片在线观看免费| 欧美另类视频| www.中文字幕av | 超碰在线观看99| 91国产视频在线| 红桃视频在线观看一区二区| 亚洲黄色片免费看| 亚洲一区二区三区四区不卡| 天堂а√在线8种子蜜桃视频| 国产国语videosex另类| 性xxxx欧美老肥妇牲乱| 91九色蝌蚪porny| 日本道免费精品一区二区三区| 看女生喷水的网站在线观看| 国产成人女人毛片视频在线| 先锋a资源在线看亚洲| 国产大屁股喷水视频在线观看| 日韩天堂在线观看| 久久毛片亚洲| wwwwww欧美| 国产亚洲一区二区在线观看| av资源免费看| 国产91九色视频| 欧美日韩ab| 国产黄色录像视频| 亚洲国产精彩中文乱码av| 欧美成a人片免费观看久久五月天| 国产高清av在线播放| 国产精品视频线看| 亚洲 精品 综合 精品 自拍| 91精品在线观看视频| 日韩vs国产vs欧美| 久久精品国产亚洲av香蕉|