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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

我所理解的 Block

發布時間:2025/4/5 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我所理解的 Block 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:bool周 原文鏈接:我所理解的 Block

關于 block 的文章,網上已經有很多了。我這里只是將這個知識點再梳理一下,從 block 使用到底層原理。畢竟年紀大了,容易忘事。

拋磚引玉

圍繞 block 所產生的問題,太多太多。這里我將這些問題羅列出來,如果你對某些問題感到懵逼,可以在下文中找到答案。找不到,私信我。

  • 為什么要用 block?畢竟它的語法難記,還容易產生內存泄漏。
  • block 的各種書寫格式,你是否了解?
  • 按內存區這一維度劃分,block 可以分為哪幾種類型,如何定義的?
  • block 是 Objective-C 對象嗎?
  • block 內部實現原理是怎樣的?
  • 怎樣寫會造成循環引用,又是如何避免循環引用?
  • 如果以上問題你都了解,可以不用往下看了。

為什么使用 Block

block 的唯一好處就是:使代碼變得更簡潔。

我們可以向一個方法以參數的形式傳遞一個 block,作為方法的 callback 函數。類似于向方法傳遞一個函數指針。這樣就不必再聲明一個新的方法,并調用,在一定程度上簡化了代碼。下面有一個例子:

使用 notification 時,常規方式是注冊一個 selector 并實現對應的方法,像這樣:

- (void)viewDidLoad {[super viewDidLoad];[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(keyboardWillShow:)name:UIKeyboardWillShowNotification object:nil]; }- (void)keyboardWillShow:(NSNotification *)notification {// Notification-handling code goes here. } 復制代碼

如果使用 block,可以寫成這樣:

- (void)viewDidLoad {[super viewDidLoad];[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillShowNotificationobject:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) {// Notification-handling code goes here. }]; } 復制代碼

另外一個簡化代碼的特性就是,block 可以捕獲外部變量。這樣就不必再以參數的形式傳遞,簡化的方法的定義和調用。

Block 長什么樣

在最初接觸 block 時,我經常寫不對,它的語法太另類。fucking block syntax 提供了各種 block 的寫法,我這里就直接照搬過來了。

  • 作為局部變量
returnType?(^blockName)(parameterTypes) = ^returnType(parameters) {...}; 復制代碼
  • 作為屬性(property)
@property (nonatomic, copy,?nullability)?returnType?(^blockName)(parameterTypes); 復制代碼
  • 定義方法時,作為方法參數
- (void)someMethodThatTakesABlock:(returnType?(^nullability)(parameterTypes))blockName; 復制代碼
  • 調用方法時,作為參數傳遞
[someObject someMethodThatTakesABlock:^returnType?(parameters) {...}]; 復制代碼
  • 作為類型別名 (typedef),增加代碼可讀性
typedef?returnType?(^TypeName)(parameterTypes); TypeName?blockName = ^returnType(parameters) {...}; 復制代碼

Block 內部原理是怎樣的

在編譯時,編譯器會將 block 語法轉化成 C 的源代碼,再將這部分 C 的源代碼編譯為編譯器處理的代碼。我們可以使用 clange (LLVM 編譯器) 來完成 "將 block 語法轉化為 C++ 源代碼 (本質還是 C)" 這一階段。具體命令如下:

clang -rewrite-objc 源代碼文件名 復制代碼
1.一個簡單 Block 的結構

下面我們轉化一段 OC 代碼來分析 block。

使用 clang -rewrite-objc main.m 轉化如下代碼:

int main(int argc, char * argv[]) {void (^myBlock) (void) = ^{printf("test block");};myBlock();return 0; } 復制代碼

轉化接入后是下面這個樣子(主要代碼)。因為語法和命名的關系,代碼看著很亂,但是邏輯很清晰。為了方便理解,我加了部分注釋。

// block 結構體??梢岳斫鉃?'block' 這種類型的基本結構 struct __block_impl {void *isa;int Flags;int Reserved;void *FuncPtr; };// 整個 block 的結構,命名有點歧義,理解即可 struct __main_block_impl_0 {struct __block_impl impl; // __block_impl 類型的成員變量struct __main_block_desc_0* Desc; // Desc 指針// 構造函數主要是為兩個成員變量賦值__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) {impl.isa = &_NSConcreteStackBlock;impl.Flags = flags;impl.FuncPtr = fp;Desc = desc;} };// block 的代碼塊,實際執行部分 static void __main_block_func_0(struct __main_block_impl_0 *__cself) {printf("test block"); }// 版本升級所需的區域和 block 大小。不懂也沒關系 static struct __main_block_desc_0 {size_t reserved;size_t Block_size; } __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0)};// main 方法 int main(int argc, char * argv[]) {// 定義 blockvoid (*myBlock) (void) = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA));// 執行 block((void (*)(__block_impl *))((__block_impl *)myBlock)->FuncPtr)((__block_impl *)myBlock);return 0; } 復制代碼

上述代碼中,定義了三個結構體:block 基本結構 __block_impl、Desc 指針 __main_block_desc_0、整個 block 的結構 __main_block_impl_0。其中 __main_block_impl_0 包含兩個成員變量,分別為 __block_impl 結構體實例和 __main_block_desc_0 指針。

上述還定義了兩個方法:block 實際執行方法 __main_block_func_0 和 main() 方法。

__main_block_func_0 方法為輸出對應的字符串("test block")。

main 方法主要分為兩步:

定義 block。將 block 實際執行方法,也就是 __main_block_func_0 的函數指針和 __main_block_desc_0_DATA 的地址傳入 __main_block_desc_0 的構造方法,構造成一個完整的 block。根據定義可以看出 __main_block_desc_0 初始化時所有的大小為 __main_block_impl_0 結構體大小。

執行 block。實際可以簡化為 *myBlock->impl.FuncPtr,就是調用對應的方法。

了解了這個基本結構,后面的都是在這基礎上追加部分代碼,很容易理解。

2.Block 結構與 isa 指針

在上述代碼中,我們可以看出 block 結構體,也就是 __block_impl 中有一個 isa 指針。我們先來看看這個 isa 指針。

“id" 這一變量類型用于存儲 OC 對象。在 runtime.h 中,它的定義如下:

typedef struct objc_objct {Class isa; } *id; 復制代碼

Class 類型屬于一個結構體指針類型,定義為:

typedef struct objc_class *Class 復制代碼

objc_class 結構體定義如下:

struct objc_class {Class isa; } 復制代碼

綜上可知,OC 中每個類的結構體就是基于 objc_class 結構體。

在上面可以看到這樣一段代碼:

impl.isa = &_NSConcreteStackBlock; 復制代碼

isa 被賦值為 _NSConcreteStackBlock 類型的指針。那么 _NSConcreteStackBlock 又是什么?通過 debug 界面我們可以看到如下情況 :

block 一供有三種類型,分別為 __NSGlobalBlock__、__NSStackBlock__、__NSMallocBlock__,這三種類型后面會詳細解釋。這里轉化的代碼和 debug 界面顯示的類型不一樣,但是基本類型以信仰,都是 Class 類型,不必糾結。

可以看出 _NSConcreteStackBlock 實際是 Class 類型。那么,block 本質就是 Objective-c 對象

3.捕獲自動變量

我們將源代碼改為如下情況:

int main(int argc, char * argv[]) {int val = 10;void (^myBlock) (void) = ^{printf("value is %i", val);};myBlock();return 0; } 復制代碼

使用 clang 進行轉化。我們只看轉化后的關鍵部分。即整個 block 結構:

struct __main_block_impl_0 {struct __block_impl impl;struct __main_block_desc_0* Desc;int val;__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _val, int flags=0) : val(_val) {impl.isa = &_NSConcreteStackBlock;impl.Flags = flags;impl.FuncPtr = fp;Desc = desc;} };static void __main_block_func_0(struct __main_block_impl_0 *__cself) {int val = __cself->val; printf("value is %i", val); } 復制代碼

可以看到局部變量 val 被自動追加到了 __main_block_impl_0 結構體中,并在構造函數中添加了參數。通過構造函數初始化 block 時,會將外部變量捕獲進來。這里捕獲的是引用,所以在 block 內部改變局部變量的值之后,并不會傳出去

4.關于 __block

正常情況下,block 捕獲的變量是不可以修改的。但是有兩種方式可以讓其修改:

  • 使用靜態變量、靜態全局變量、全局變量。因為前兩個生成在靜態數據區,最后一個生成在堆區。它們都不會隨著 block 棧的消失而被釋放。出了 block 作用域依然有效。但是平時使用這種變量諸多不變。
  • 使用 __block 關鍵字修飾。它類似于 static、auto 和 register 這些關鍵字,主要來指定變量存儲在哪個區域。

為什么使用 __block 關鍵字修飾之后就可以修改。我們使用 clang 轉化如下一段代碼:

int main(int argc, char * argv[]) {__block int val = 10;void (^myBlock) (void) = ^{val = 20;};myBlock();return 0; } 復制代碼

轉換后如下,可以看出加了一句 __block 多了很多代碼,依然是代碼很亂,但是邏輯很清晰,我們只看主要部分 :

struct __Block_byref_val_0 {void *__isa; __Block_byref_val_0 *__forwarding;int __flags;int __size;int val; };struct __main_block_impl_0 {struct __block_impl impl;struct __main_block_desc_0* Desc;__Block_byref_val_0 *val; // by ref__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, __Block_byref_val_0 *_val, int flags=0) : val(_val->__forwarding) {impl.isa = &_NSConcreteStackBlock;impl.Flags = flags;impl.FuncPtr = fp;Desc = desc;} };static void __main_block_func_0(struct __main_block_impl_0 *__cself) {__Block_byref_val_0 *val = __cself->val; // bound by ref(val->__forwarding->val) = 20; }static void __main_block_copy_0(struct __main_block_impl_0*dst, struct __main_block_impl_0*src) {_Block_object_assign((void*)&dst->val, (void*)src->val, 8/*BLOCK_FIELD_IS_BYREF*/); }static void __main_block_dispose_0(struct __main_block_impl_0*src) {_Block_object_dispose((void*)src->val, 8/*BLOCK_FIELD_IS_BYREF*/); }static struct __main_block_desc_0 {size_t reserved;size_t Block_size;void (*copy)(struct __main_block_impl_0*, struct __main_block_impl_0*);void (*dispose)(struct __main_block_impl_0*); } __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0), __main_block_copy_0, __main_block_dispose_0};int main(int argc, char * argv[]) {__attribute__((__blocks__(byref))) __Block_byref_val_0 val = {(void*)0,(__Block_byref_val_0 *)&val, 0, sizeof(__Block_byref_val_0), 10};void (*myBlock) (void) = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA, (__Block_byref_val_0 *)&val, 570425344));((void (*)(__block_impl *))((__block_impl *)myBlock)->FuncPtr)((__block_impl *)myBlock);return 0; } 復制代碼

我們可以看出局部變量轉化為一個結構體:

struct __Block_byref_val_0 {void *__isa; __Block_byref_val_0 *__forwarding;int __flags;int __size;int val; }; 復制代碼

在 __main_block_impl_0 中追加了一個 __Block_byref_val_0 結構體指針,后續的初始化和修改 val 的值也是通過指針來操作。所以修改后的值就可以傳出去了。

5.block 的存儲類型

前面有提到過,block 按照存儲類型劃分,可以分為三種:

  • _NSConcreteGlobalBlock
  • _NSConcreteStackBlock
  • _NSConcreteMallocBlock

他們在內存中的存儲結構如下圖所示,對號入座:

我們分別來解釋一下。

**_NSConcreteGlobalBlock,也叫全局 block。**有兩種生成方式: 一種是在全局的地方生成,不存在捕獲局部變量的情況。例如:

void(^globalBlock)(void) = ^{printf("this is global block");};int main(int argc, char * argv[]) {globalBlock();return 0; } 復制代碼

另一種是,block 中不截獲局部變量。例如:

typedef int (^TestBlock) (int); int main(int argc, char * argv[]) {TestBlock block = ^(int num) {printf("num is %d",num);}return 0; } 復制代碼

**_NSConcreteStackBlock,也叫棧 block。**除了上述的初始化方式,通過其他方式初始化為的 block 都是棧 block。

_NSConcreteMallocBlock,也叫堆 block。 堆 block 不是由代碼初始化來的,而是由棧 block 調用 copy 方法時從棧內存拷貝到堆內存而得來的。

至于什么時候會發生 copy 操作,可以總結為一下幾點 (ARC 環境):

  • Cocoa 框架的方法且方法名中含有 usingBlock。
  • GCD 中的方法。
  • block 賦值給強引用對象時。
  • 作為返回值時。
  • 顯示調用 copy 方法。

下面是一些例子:

typedef BOOL (^TestBlock)(NSString *); typedef void (^paramBlock)(NSString *);@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];int val = 10;// block1 is global blockvoid (^block1)(NSString *) = ^(NSString *name) {NSLog(@"this is global block");};// block2 is malloc blockvoid (^block2)(NSString *) = ^(NSString *name) {int value = 10 * val;NSLog(@"this is malloc block");};// block3 is stack block__weak void (^block3)(NSString *) = ^(NSString *name) {int value = 10 * val;NSLog(@"this is stack block");};// block4 is malloc blockTestBlock block4 = [self testWithBlock:^(NSString *name) {NSLog(@"noting");}];// block5 is global blockTestBlock block5 = [self getGlobalBlock];}- (TestBlock)testWithBlock:(paramBlock)block {dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"capture block is %@",block); // malloc block});int val = 10;return ^BOOL(NSString *name) {int value = val * 10;NSLog(@"noting");return YES;}; }- (TestBlock)getGlobalBlock {return ^BOOL(NSString *name) {NSLog(@"nothing");return YES;}; } 復制代碼
6. __block 變量結構中的 __forwarding

在前面的代碼中,我們發現 __block 代碼中有一個 __forwarding,如下面的代碼:

struct __Block_byref_val_0 {void *__isa; __Block_byref_val_0 *__forwarding;int __flags;int __size;int val; }; 復制代碼

長話短說。當一個棧 block 捕獲了一個在棧上生成的 __block 變量,那么隨著 block 從棧上 copy 到堆上,這個 __block 變量也從棧上 copy 到堆上。因為有一個 __forwarding 指針,使得無論從從棧上還是堆上,訪問的都是一個變量。如果沒有明白看下面的圖和代碼。

__block int val = 10;void (^block)(int) = [^(int count) { val++;} copy];val++; block();NSLog(@"val is %d",val); // val is 12; 復制代碼

無論是操作棧上的 val 變量還是堆上的 val 變量,最終修改的是同一個值。

7.block 與循環引用

發生循環引用說明出現了互相持有的現象,例如下面這樣:

上圖中 self 持有 blk 屬性,blk 持有 block,block 持有 self,這就形成了一個環?,F如今的 Xcode 已經很智能,這種簡單的循環引用,會出現警告。

為避免循環引用,可以使用 __weak 關鍵字。例如下面這樣:

__weak typeof(self) weakSelf = self;self.blk = ^BOOL(NSString *name) {[weakSelf log];return YES; }; 復制代碼

為了避免在 block 內使用 self 期間,self 被釋放??梢栽?block 內部對 self 進行強引用。因為這個強引用生成在 block 棧內,會隨著 block 的作用域消失而消失。不會產生循環引用。

__weak typeof(self) weakSelf = self;self.blk = ^BOOL(NSString *name) {__strong typeof(self) self = weakSelf;[self log];return YES; }; 復制代碼

如何使用 Block

前面講了很多原理,過程中也講了很多使用。這里只總結幾點,使用 block 一定要注意:

  • block 的命名方式,牢記。
  • 對于要再 block 內修改的變量,加 __block 修飾符。對于 OC 中的一些對象,例如 NSMutableArray,如果只修改數組內的元素,不需要加 __block;如果要修改數組的指針,需要加 __block。
  • 使用自定義 block 時,注意循環引用的問題。尤其是各種間接關系產生的循環引用。
  • 對于捕獲到 block 中的弱引用,如果怕使用期間被釋放,需要再 block 內部再次強引用一下。

綜上,block 總結完畢,祝好運。

參考文獻

1.A Short Practical Guide to Blocks

2.How Do I Declare A Block in Objective-C?

3.Objective-C高級編程

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的我所理解的 Block的全部內容,希望文章能夠幫你解決所遇到的問題。

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

午夜久久久久久久久 | 日本巨乳在线 | 亚洲日韩中文字幕 | 免费在线观看av电影 | 91九色丨porny丨丰满6 | 亚洲黄色片一级 | 国产丝袜 | 99精品久久只有精品 | 国产视频在线观看一区二区 | 久久精品99国产国产 | 波多野结衣网址 | 欧美日韩中文另类 | 久久福利精品 | 97成人免费视频 | 欧美激情奇米色 | 国产美女免费视频 | 在线观看av小说 | 天堂麻豆 | 精品久久久久久国产 | 开心激情婷婷 | 国产精品va最新国产精品视频 | 毛片的网址| 婷婷久久五月天 | 毛片3| 色综合欧洲 | 亚洲自拍av在线 | 国产成人高清在线 | a√国产免费a | av日韩av| 在线观看中文字幕dvd播放 | 欧美在线18 | 久久精品美女视频 | 亚洲国产精品推荐 | 天天干天天插 | 99精品国自产在线 | 我要色综合天天 | 91精品一区国产高清在线gif | 久久久高清 | 日韩资源在线观看 | 欧美专区亚洲专区 | 日日夜夜网站 | 最新国产精品拍自在线播放 | 久插视频 | 日韩电影久久 | 午夜视频在线瓜伦 | 国内视频| 97人人爽人人 | 99热这里只有精品免费 | 国内精品久久久久影院一蜜桃 | 午夜少妇av | 久久国产精品二国产精品中国洋人 | 中文字幕一区二区三区在线观看 | 狠狠色伊人亚洲综合网站色 | 成人免费网站视频 | 狠狠狠的干 | 国产成人不卡 | 色综合天天视频在线观看 | 免费观看一区二区 | 热久久免费国产视频 | 2018好看的中文在线观看 | 久久视频国产 | 久久综合色综合88 | 亚洲国产三级在线 | 精品国产乱码久久久久 | 亚洲欧美国产精品 | 中文字幕亚洲字幕 | 国产精品18久久久久久vr | 在线观看91久久久久久 | 亚洲成人精品影院 | 99视频免费播放 | 久久天天躁夜夜躁狠狠躁2022 | 91亚洲免费 | 国产精品av在线 | 91伊人| 成人午夜电影免费在线观看 | 中文字幕有码在线播放 | 欧美性生活大片 | 国产精品99在线播放 | 天天爽夜夜爽精品视频婷婷 | 久久久影院一区二区三区 | 91亚洲国产 | 国产日产精品一区二区三区四区的观看方式 | 日韩欧美精品在线观看视频 | 中文在线天堂资源 | 99免费在线视频观看 | www四虎影院| 国内视频在线观看 | 夜夜夜草 | 国产精品久久99精品毛片三a | 久久久麻豆精品一区二区 | 国产高清一 | 国产欧美精品一区二区三区 | 在线 你懂 | 欧美激情综合色 | 91在线观看欧美日韩 | 草免费视频 | 伊人午夜 | 久久久精品99 | 中文字幕在线国产精品 | 97国产一区二区 | 亚洲黄色软件 | 日韩成片 | 日韩中文字幕免费电影 | 国产精品视频免费 | 欧美精品一区二区性色 | 色网址99| 亚洲精品456在线播放第一页 | 亚洲精品国偷拍自产在线观看蜜桃 | 日韩av电影一区 | 国产理论免费 | 国产色影院 | 国产中文 | 丁香六月国产 | 国产精品嫩草影院99网站 | 久久免费视频这里只有精品 | 狠狠网站| www视频在线播放 | 在线国产一区二区 | 欧美乱熟臀69xxxxxx | 精品国产一区二区三区日日嗨 | 97免费在线观看 | 天海翼一区二区三区免费 | 国产 成人 久久 | 日韩久久精品一区二区 | 久久久精品网站 | 国产在线精品福利 | 久久精品欧美日韩精品 | 性色av免费观看 | 在线精品视频免费观看 | 久久涩视频 | 99福利片 | 亚洲少妇影院 | 欧美一二三区在线观看 | 久久曰视频| 免费在线黄色av | 色就干| 黄色大片日本免费大片 | 超碰在线94 | 欧美色图一区 | 国产网红在线观看 | 91在线麻豆 | 激情丁香| 久久嗨 | 97久久精品午夜一区二区 | 中文字幕日本电影 | 三级黄色在线 | 亚洲一区二区视频 | 91视频91蝌蚪 | av电影在线不卡 | 亚洲精品乱码白浆高清久久久久久 | 狠狠色丁香久久婷婷综合五月 | 久久精品99国产国产精 | 国产成人亚洲在线观看 | 国产夫妻性生活自拍 | 91桃花视频 | 午夜国产福利在线 | 人人添人人澡 | 91精品久久久久久久久久久久久 | 久久久久久久久影院 | 日日夜色 | 精品视频在线免费观看 | 免费激情网 | 91网址在线| 国内精品视频在线 | 中文字幕在线视频一区 | 欧美精彩视频在线观看 | 国产精品国产自产拍高清av | 国产精品毛片久久久久久久久久99999999 | 日韩无在线 | 激情图片久久 | 男女日麻批| 国产黄色片久久久 | 综合天天色| 国产福利av在线 | 成人影音在线 | 日本h在线播放 | 免费网站v | 蜜臀久久99精品久久久久久网站 | 欧美激情另类文学 | 黄色亚洲 | 天天躁日日躁狠狠躁 | 狠狠躁日日躁狂躁夜夜躁av | 最近中文字幕在线中文高清版 | 国产日韩欧美在线播放 | 在线观看视频一区二区三区 | 亚洲精品国产成人 | 97福利社 | 国产91成人 | 久久五月婷婷丁香社区 | 亚洲专区在线 | 69av视频在线观看 | 日韩欧美有码在线 | 日韩av快播电影网 | 在线观看中文字幕亚洲 | 久久综合99| 在线视频黄 | 国产精品美女久久久久久 | 成人a视频片观看免费 | 99热在线这里只有精品 | 亚州国产精品 | 人人干干人人 | 一区在线观看 | 国产亚洲情侣一区二区无 | 中文有码在线 | 中文字幕精品三区 | 国产一级一级国产 | 国产高清视频在线观看 | 日韩久久久久久久久久 | 四虎成人免费影院 | 五月情婷婷 | 日韩女同一区二区三区在线观看 | 91久久人澡人人添人人爽欧美 | 特黄免费av | 在线观看国产区 | 91黄色在线视频 | 国产精品国内免费一区二区三区 | 国产成人久久av | 久久九九免费视频 | 亚洲精品中文字幕在线观看 | 婷婷丁香导航 | 久久97久久97精品免视看 | 日韩欧美在线视频一区二区 | 91av原创| 国产丝袜网站 | 免费日韩 精品中文字幕视频在线 | 麻豆成人在线观看 | 又湿又紧又大又爽a视频国产 | 国内精品久久久久久久97牛牛 | 日韩在线视频在线观看 | 成人免费在线电影 | 久久久久在线观看 | 精品一区二区三区在线播放 | 中文字幕乱码电影 | 国产日韩三级 | 日韩区视频 | 国产精品久久久一区二区三区网站 | 色网站免费在线观看 | 久久久国产一区二区三区 | 免费黄色在线网站 | 日韩日韩日韩日韩 | 奇米影视8888在线观看大全免费 | 精品国产aⅴ麻豆 | 99热最新网址 | 2017狠狠干| 精品久久久国产 | 日韩精品一区二区三区丰满 | 天天色影院 | 国产精品一区二区 91 | 国产精品6 | 91麻豆免费视频 | 久久香蕉国产精品麻豆粉嫩av | 日韩av一区在线观看 | 久久国产精品99久久久久久老狼 | 最近日本字幕mv免费观看在线 | 久久久久久久99 | 久久精品在线免费观看 | 亚洲精品久久久久久久蜜桃 | 久久免费片 | 日日干天天爽 | 色视频网站在线观看一=区 a视频免费在线观看 | 欧美日韩1区2区 | 久久综合久久综合九色 | 精品一区二区三区久久久 | 超碰人在线| 亚洲黄色片在线 | av网站免费线看精品 | 日韩激情av在线 | 精品免费久久久久 | 亚洲精品在线免费播放 | 国产在线看 | 狠狠干激情 | 中文字幕免费国产精品 | 国产精品黄色av | 麻豆国产精品视频 | 91在线视频免费 | 99久久久久久久久 | 偷拍福利视频一区二区三区 | 国产精品欧美久久久久天天影视 | 免费看搞黄视频网站 | 日韩欧美一区二区三区在线观看 | 97综合在线 | 日韩av专区 | 黄色成人av | 国产中文在线字幕 | 五月开心六月婷婷 | 黄色天堂在线观看 | 热久久国产 | 国产在线欧美日韩 | 精品国产伦一区二区三区观看说明 | 国产精品视频线看 | 伊人电影在线观看 | 黄色a视频免费 | 久久久久免费网 | 亚洲国产69 | 欧美日韩国产一二三区 | 久久久久久久久久电影 | 久久精品99国产国产 | 91精品老司机久久一区啪 | 91在线产啪 | 亚洲手机av | 久久不射电影院 | 免费午夜在线视频 | 国产伦精品一区二区三区免费 | 精品久久久久久国产91 | 欧美性视频网站 | 色a综合 | 国产精品福利av | 天天草综合 | 久久一区91 | 91成人免费看片 | 亚洲成人精品在线观看 | 在线午夜av| 永久免费的av电影 | 国产精品一区二区在线播放 | 国产一级精品绿帽视频 | 精品国产一区二区三区噜噜噜 | 久久99电影 | av中文在线观看 | x99av成人免费 | 美女免费黄视频网站 | 27xxoo无遮挡动态视频 | 国产精品黄色影片导航在线观看 | 天天干,天天射,天天操,天天摸 | 亚洲四虎 | 国产高清视频在线播放 | 久久这里只有精品1 | 国产激情电影综合在线看 | 在线一区av | 精品国产乱子伦一区二区 | 亚洲成aⅴ人在线观看 | www.久久久| 中文字幕丝袜美腿 | 国产黄a三级三级三级三级三级 | 青青草国产成人99久久 | 成年人免费看的视频 | 国产精品午夜免费福利视频 | 国产精品18久久久久久不卡孕妇 | 日日添夜夜添 | 美女久久久久 | 国产 一区二区三区 在线 | 黄色网址国产 | 国产精品a久久 | 国产高清在线a视频大全 | 久久久久久国产精品美女 | 99国产精品久久久久久久久久 | 亚洲视频电影在线 | 国产在线污| 国产视频网站在线观看 | 欧美色综合久久 | 婷婷色av | 亚洲a免费| 久久天 | 色婷婷电影 | 天天天天射 | 五月婷香蕉久色在线看 | 久久久久久久久久久久亚洲 | 日韩视频免费看 | 久草精品视频在线播放 | 日韩精品久久久久 | 久久99国产精品久久99 | 国产精品久久在线 | 日韩精品一区二区三区免费观看 | 6080yy精品一区二区三区 | 日本韩国精品一区二区在线观看 | 91探花国产综合在线精品 | 深爱激情五月网 | 视频二区 | 天天干夜夜爱 | 久久久国产精品一区二区三区 | 麻豆视频在线免费观看 | 国产亚洲欧美日韩高清 | 午夜成人免费影院 | www日韩高清| 日韩一级精品 | 欧美日韩国产在线 | 精品免费久久久久久 | www.天天射 | 婷婷色狠狠 | 中文字幕在线视频一区二区三区 | 91视频国产免费 | 欧美精品九九99久久 | 婷婷资源站 | 97天天综合网 | 久青草视频 | 五月婷网 | 最近中文字幕免费视频 | 手机在线永久免费观看av片 | 国产成人精品一区二区三区福利 | 日日干,天天干 | 欧美成人a在线 | 在线视频 区 | 欧美日韩中文字幕视频 | 激情欧美一区二区三区免费看 | 91视视频在线直接观看在线看网页在线看 | 一区二区三区日韩在线观看 | 最近日本韩国中文字幕 | 中文字幕精品一区二区三区电影 | 日本午夜免费福利视频 | 午夜美女福利 | 在线观看中文字幕第一页 | 精品国产乱码久久久久久天美 | 色视频在线免费观看 | 在线观看精品一区 | 国产手机精品视频 | 亚洲清纯国产 | 香蕉视频免费看 | 国产精品一区二区 91 | 日本中文字幕影院 | 亚洲精品国产精品国自 | 精品国产视频在线观看 | 天天添夜夜操 | 可以免费看av | 日韩精品一二三 | 韩日精品视频 | 色婷婷综合五月 | 99久久久国产免费 | 六月色丁香| 国产精品刺激对白麻豆99 | 久久在线观看视频 | 天天综合久久 | av福利资源 | 国产男女无遮挡猛进猛出在线观看 | 欧美亚洲精品一区 | 欧美日一级片 | 日韩精品第1页 | 亚洲狠狠婷婷综合久久久 | 国产精品99久久久久人中文网介绍 | 日韩在线不卡视频 | 亚州国产视频 | 四虎永久精品在线 | 亚洲精品乱码久久久久久蜜桃不爽 | 欧美精彩视频在线观看 | 四虎成人精品永久免费av九九 | 欧美性性网 | 91视频国产免费 | 成人免费在线播放视频 | 五月婷婷六月丁香激情 | 蜜臀久久99精品久久久久久网站 | a级国产乱理论片在线观看 伊人宗合网 | av片中文| 欧美日韩中文另类 | 五月天激情视频 | 狠狠色丁香婷婷综合久小说久 | 亚洲污视频 | 久久久精品视频网站 | 欧美夫妻生活视频 | 九九久久免费 | 婷婷国产一区二区三区 | 一区二区视频在线看 | 一区二区三区免费在线 | 成人免费网视频 | 久久久香蕉视频 | 天天射天天色天天干 | 西西人体www444 | 波多野结衣一区 | 综合网久久 | 91刺激视频| 久久99国产一区二区三区 | 国产视频久久 | 91麻豆传媒| 欧美动漫一区二区三区 | 亚洲午夜大片 | 97在线精品| av在线亚洲天堂 | 99久久精品国产一区二区成人 | 欧美二区三区91 | 四虎www com| 激情五月在线观看 | 免费手机黄色网址 | 亚洲精区二区三区四区麻豆 | 四虎国产精品免费 | 精品毛片在线 | 一级一片免费观看 | 欧美久久成人 | 六月丁香久久 | 国产日产高清dvd碟片 | 天天干天天做天天操 | 日韩精品免费一区二区三区 | 久久久免费看片 | 麻豆视频免费在线播放 | 久草男人天堂 | 久久精品视频国产 | 99精品观看| 六月婷操 | 国产精品女主播一区二区三区 | 久久视频国产 | 久久久精品欧美 | 九九九免费视频 | 日本黄色黄网站 | 久草网站在线 | 91三级视频 | av九九| 免费视频三区 | 91免费版在线观看 | 国产成人精品久 | 亚洲一二三在线 | www色网站| 欧美va天堂va视频va在线 | 色在线网| 在线免费视 | 欧美国产亚洲精品久久久8v | 亚洲第一区在线播放 | 九九免费在线观看 | 免费久久精品视频 | 免费看黄网站在线 | 中文字幕乱码电影 | 国产精品99久久久久久武松影视 | 日日夜夜精品免费观看 | 在线观看免费av片 | 亚洲专区免费观看 | 日韩网站免费观看 | 亚州国产精品久久久 | 国产成人亚洲在线观看 | 国产精品一区二区视频 | 24小时日本在线www免费的 | 蜜臀av夜夜澡人人爽人人桃色 | 国产精品人成电影在线观看 | 国产一区二区三区在线免费观看 | 99国产在线观看 | 久久精品免费电影 | 欧美韩日精品 | 精品一二三四五区 | 国产一区在线视频播放 | 久久精品老司机 | 狠狠躁夜夜av | 91视视频在线直接观看在线看网页在线看 | 成人av亚洲| 天堂久久电影网 | 久久精品一区二区三区视频 | 视频成人 | www.人人草 | 国产黄色美女 | 久久久一本精品99久久精品 | 午夜视频亚洲 | 精品美女在线观看 | 亚洲电影免费 | 国产精品久久久久一区二区三区共 | a久久免费视频 | av一区二区在线观看中文字幕 | 99久久日韩精品免费热麻豆美女 | 日韩在线观看视频一区二区三区 | 91麻豆国产| 国产精品入口麻豆www | 日韩视频区 | 91探花国产综合在线精品 | 粉嫩av一区二区三区四区 | 久精品一区 | 免费在线中文字幕 | 亚洲乱码中文字幕综合 | 三级黄在线 | 天天天射 | 一级淫片a| 亚洲最新精品 | 欧美日韩一区二区三区免费视频 | 日韩欧美一区二区三区在线 | 亚洲精品乱码久久久久久蜜桃91 | 人人爽人人看 | 亚洲少妇自拍 | 欧美片网站yy | av中文字幕在线观看网站 | 亚洲欧美综合精品久久成人 | 激情 一区二区 | 国产美女免费 | 天天干视频在线 | 中文字幕在线电影 | 久草电影免费在线观看 | 久久精品国亚洲 | 激情电影影院 | 亚洲区精品视频 | 亚洲一级黄色大片 | 中文字幕人成乱码在线观看 | 久久视了 | 国产精品久久av | 久久综合偷偷噜噜噜色 | 久久精品久久精品久久精品 | 91在线精品秘密一区二区 | 97干com| 在线观看久草 | 色多多在线观看 | 久久久久久久久久网 | 手机av永久免费 | 超碰97国产 | 精品国产理论 | 永久黄网站色视频免费观看w | 午夜久久成人 | 国产专区一 | 最新中文字幕 | 精品国产一区二区三区久久久蜜月 | 福利视频导航网址 | 久久不色 | www.精选视频.com | 日韩一区二区三区高清在线观看 | 精品福利网站 | 韩日精品中文字幕 | 免费在线观看av片 | 国产精品一区二区久久精品爱涩 | 欧美国产91 | 亚洲91在线 | 日韩欧美综合精品 | 美女精品 | 不卡的av| 五月天久久久久 | 97国产精品一区二区 | 欧美少妇xxx | 操高跟美女 | 亚洲精品午夜久久久 | 狠狠色狠狠色合久久伊人 | 日韩欧美在线中文字幕 | 69热国产视频 | 欧美福利精品 | 91探花国产综合在线精品 | 国产 日韩 在线 亚洲 字幕 中文 | 看av在线 | av日韩在线网站 | 久久夜夜操 | 四虎成人精品 | 四虎成人精品在永久免费 | 久久久精品久久 | 91网页版免费观看 | 免费国产一区二区视频 | 黄在线免费看 | 国产激情免费 | 96精品视频 | av黄色免费在线观看 | 午夜av网站 | 国产精品一区二区精品视频免费看 | 成人黄色大片 | 婷婷资源站 | 婷婷综合影院 | 在线免费性生活片 | 免费在线国产精品 | 国产资源精品在线观看 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 一区二区精品在线 | 欧美日韩国产精品久久 | 国产xx在线 | 国产精品高清一区二区三区 | 久久成人国产精品一区二区 | 日韩欧美国产精品 | 欧美巨乳网 | 精品亚洲一区二区 | a色视频 | 97在线视频观看 | 中国美女一级看片 | 黄色成品视频 | 久久综合五月天婷婷伊人 | 国产精品日韩久久久久 | 91看片在线 | 国产一区二区中文字幕 | 欧美一级片在线播放 | 91麻豆精品国产91久久久无需广告 | 天天干天天操天天 | 久久国产精品免费一区二区三区 | 最新中文字幕在线资源 | 91探花视频 | 国产一区国产精品 | 国产 视频 久久 | 天堂在线视频中文网 | 中文字幕成人一区 | 国产精品久久久久久久久毛片 | av午夜电影 | 97电影院在线观看 | 99久久久国产精品免费观看 | 不卡的av中文字幕 | 国产成人三级在线 | 国产精品成人国产乱 | 人人干人人上 | 亚洲va欧美va人人爽 | 日韩 在线a | 玖玖玖在线观看 | 久久大香线蕉app | 精品福利视频在线 | 美女免费视频网站 | 久久在线精品视频 | 九九视频精品免费 | 国产在线欧美日韩 | 成人影片免费 | 久久久久免费看 | 激情文学丁香 | 亚洲成a人片综合在线 | a级片久久久 | 99麻豆视频 | 91视频在线免费看 | 亚洲a色| 午夜 免费 | 夜夜躁天天躁很躁波 | 国产在线第三页 | 草樱av | 国产剧情一区二区在线观看 | 色偷偷88888欧美精品久久 | 一本到在线 | 永久免费精品视频网站 | 九九色在线 | 亚洲永久精品国产 | 狠狠色丁香久久婷婷综合五月 | 国产不卡精品视频 | 视频一区久久 | 99久久久久国产精品免费 | 亚洲日本色 | 日日干激情五月 | 久久久久久久久久福利 | www.99热精品| 91亚洲精品国产 | 久久久久久视频 | 一区二区三区高清在线观看 | 久久er99热精品一区二区 | 欧美a性| 九九视频网 | 丁香狠狠 | 97在线免费 | 五月av在线| 亚洲一级影院 | 黄色av影视 | 91免费观看网站 | 99热精品国产 | 九九免费在线观看 | 波多野结依在线观看 | 国产 在线 高清 精品 | 天天色天天射天天综合网 | 色欲综合视频天天天 | 国产精品av久久久久久无 | 亚洲国产一区二区精品专区 | av在线中文 | 免费影视大全推荐 | 成人一区二区在线 | www.精选视频.com | 黄色大片国产 | 在线看日韩 | 九色精品免费永久在线 | 在线视频99 | 精品久久久久久国产91 | 国产精品久久久久久久婷婷 | 操操操影院| 黄色精品久久久 | 免费一级黄色 | 亚洲人成网站精品片在线观看 | a在线观看国产 | 国产一区福利 | 婷婷夜夜| 久久精品三 | aa级黄色大片 | 欧美极品少妇xbxb性爽爽视频 | 丝袜美女在线 | 国产免码va在线观看免费 | 欧美专区日韩专区 | av丝袜在线 | 午夜电影久久久 | 人人舔人人舔 | 久久久久久视频 | 91人人揉日日捏人人看 | 欧美色噜噜 | 在线看不卡av | 99精品国产免费久久 | 四虎海外影库www4hu | 国产精品美女久久久久久久 | 亚洲高清网站 | 香蕉视频网站在线观看 | 天天干夜夜 | 日韩专区在线 | 99色在线观看 | 亚洲精品久久久久999中文字幕 | av在线之家电影网站 | 国产美女主播精品一区二区三区 | 一级黄色片在线免费观看 | 亚洲精品在线视频播放 | 国产一级片免费播放 | 91精品一区二区三区久久久久久 | 黄色最新网址 | av中文天堂 | 国产精品电影一区二区 | 91爱爱电影 | 91国内产香蕉 | 久久无码av一区二区三区电影网 | 国产精品伦一区二区三区视频 | 中文字幕之中文字幕 | 免费视频黄 | 一区二区三区精品久久久 | www在线观看国产 | 碰天天操天天 | 久久亚洲福利视频 | 日韩欧美视频在线播放 | 久久国产午夜精品理论片最新版本 | 视频一区二区视频 | 久草在线久草在线2 | 亚洲国产999| 99在线精品视频在线观看 | www.久久免费视频 | 久久久精品 一区二区三区 国产99视频在线观看 | 午夜精品在线看 | 国产精品99久久久久久大便 | 日韩午夜在线播放 | 99九九热只有国产精品 | 91精品国产福利在线观看 | 久久黄网站 | 午夜电影av| 欧洲亚洲精品 | 久久伦理电影 | 99久久精品免费看 | 97涩涩视频 | 天无日天天操天天干 | 久草在线免费电影 | 欧美日韩精品二区第二页 | 国产精品1区2区 | 丁香婷婷综合五月 | 欧美激情视频在线观看免费 | 精品婷婷 | 91精品视频在线观看免费 | 91亚洲精品乱码久久久久久蜜桃 | 九草视频在线观看 | 国产一卡二卡在线 | 色干综合 | 99久久99久久精品国产片果冰 | 操操爽| 亚洲天堂视频在线 | 一区二区观看 | 日本99干网 | 国产欧美中文字幕 | 精品欧美乱码久久久久久 | 天操夜夜操 | 亚洲最大在线视频 | 99久久久久久国产精品 | 久久伊人八月婷婷综合激情 | 日韩一级黄色大片 | 成年人视频在线免费观看 | 久久久国内精品 | 亚洲一区二区三区miaa149 | 免费av视屏 | 91成人在线观看高潮 | 一级黄色片在线免费看 | 国产69久久精品成人看 | 久久高清精品 | 色偷偷网站视频 | 美女视频久久久 | 狠狠干.com| 超碰av免费| 一区二区三区国产欧美 | 在线日本看片免费人成视久网 | 九九热免费视频在线观看 | 中文字幕在线看片 | 久久久综合香蕉尹人综合网 | 91成人观看| 国模精品在线 | 久久视频6| 日韩精品一区二区免费视频 | 日本高清中文字幕有码在线 | 一区二区三区日韩在线 | 中文在线√天堂 | 中文字幕免费高清在线 | 久久一区91 | 丁香六月婷婷开心婷婷网 | 字幕网在线观看 | www.超碰| 久久综合99 | 精品主播网红福利资源观看 | 夜夜嗨av色一区二区不卡 | 日韩在线视频国产 | 在线观看网站黄 | 五月激情丁香婷婷 | 国产 日韩 在线 亚洲 字幕 中文 | 精品国产伦一区二区三区观看说明 | 国产做a爱一级久久 | www.五月天 | 2019中文最近的2019中文在线 | 香蕉久久久久 | 久久精品国产亚洲aⅴ | 黄色av网站在线观看免费 | 中文字幕一区二区三区久久 | 色婷婷综合在线 | 国产亚洲视频中文字幕视频 | 婷婷久月 | 婷婷国产视频 | 欧洲激情综合 | 91社区国产高清 | 永久免费的啪啪网站免费观看浪潮 | 五月开心六月伊人色婷婷 | 国产精品国内免费一区二区三区 | 五月天,com| 久草在线一免费新视频 | 在线天堂亚洲 | www.狠狠操 | 人人干人人艹 | 久久精品国产一区二区三区 | 久久久午夜精品理论片中文字幕 | 91精品电影 | 免费观看av网站 | 国产精品久久久免费看 | 中文字幕视频在线播放 | 人人超碰97 | 亚洲综合色婷婷 | 国产一区二区手机在线观看 | 91福利视频久久久久 | 久久久久久伊人 | 久久久久国产一区二区三区四区 | 一级黄色片毛片 | 国产又粗又长又硬免费视频 | 国产精品一区专区欧美日韩 | 最新在线你懂的 | 亚洲伊人色 | 中文字幕免费高清av | 天天操天天干天天操天天干 | 五月天综合 | 国产.精品.日韩.另类.中文.在线.播放 | 狠狠操狠狠干2017 | 国产免费观看高清完整版 | 伊人久在线 | 天堂av在线免费 | 黄色视屏在线免费观看 | 深爱激情久久 | 亚洲闷骚少妇在线观看网站 | 黄色一级在线观看 | 蜜臀av夜夜澡人人爽人人桃色 | 国产在线视频一区 | 久久精品综合一区 | 在线观看日韩中文字幕 | 国语对白少妇爽91 | 免费久久久 | 九九久久久久久久久激情 | 公开超碰在线 | 久久久鲁 | 最新国产福利 | 国产精品video爽爽爽爽 | 久久草精品 | 中文字幕在线字幕中文 | 天天色宗合 | 成人黄色av网站 | 久在线| av在线之家电影网站 | japanese黑人亚洲人4k | 久久久久久久久久久久影院 | 久久草av | 欧美三人交| 欧美午夜精品久久久久久浪潮 | 久久精品欧美一区二区三区麻豆 | 日韩 国产 | 国产一级a毛片视频爆浆 | 久久亚洲免费 | 日韩精选在线观看 | 国产 日韩 在线 亚洲 字幕 中文 | 久久免费资源 | 蜜臀av夜夜澡人人爽人人 | 久久精品人人做人人综合老师 | 又黄又爽又无遮挡的视频 | 草免费视频 | 色综合欧洲 | 在线成人一区 | 97视频免费观看2区 亚洲视屏 | 婷婷六月天综合 | 99在线观看精品 | av电影在线免费观看 | 亚洲精品乱码白浆高清久久久久久 | 国产亚洲情侣一区二区无 | 天天操夜夜干 | 超碰av在线播放 | 97超碰免费| 深爱婷婷久久综合 | 一区在线观看 | 亚洲欧美国产日韩在线观看 | 麻豆一二| 黄色三级久久 | 日韩美一区二区三区 | 精品国产乱码久久久久久久 | 91黄色免费看 | 国产日本亚洲高清 | 久久精品久久精品久久精品 | 亚洲永久精品视频 | 久草线 | 黄色视屏免费在线观看 | 午夜精品一区二区三区在线播放 | 国产成人av网 | 成人久久综合 | 国产v在线 | 久久久久夜色 | 日韩aⅴ视频 | 国产精品一区二区免费在线观看 | 国产福利小视频在线 | 久久免费国产视频 | 国产免费视频一区二区裸体 | 国产精品久久电影观看 | 国产精品久久久久久久久久不蜜月 | 黄色片网站av | 中文字幕在线网址 | 久久久午夜视频 | 午夜久草 | 日韩精品免费专区 | 国产高清网站 | 国产精品久久久久毛片大屁完整版 | 中文在线8资源库 | 免费观看www视频 | 国产精品一区二区在线观看 | 人成免费网站 | 久久精品国产99国产 | 在线观看你懂的网址 | 一本一本久久a久久精品综合小说 | 国语自产偷拍精品视频偷 | 国产精品一区二区三区在线 | 亚洲人视频在线 | 久草在线免费在线观看 | 国产黄色理论片 |