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

Objective-C內存管理教程和原理剖析

移動開發 iOS
本文介紹的是Objective-C內存管理教程和原理剖析,本文涉及的內存管理是針對于繼承于NSObject的Class。那么我拼命先來看內容。

Objective-C內存管理教程和原理剖析,是在iPhone Mac平臺的基礎上,我們先來看內容。

初學objectice-C的朋友都有一個困惑,總覺得對objective-C內存管理機制琢磨不透,程序經常內存泄漏或莫名其妙的崩潰。我在這里總結了自己對objective-C內存管理機制的研究成果和經驗,寫了這么一個由淺入深的教程。希望對大家有所幫助,也歡迎大家一起探討。

一 基本原理

Objective-C的內存管理機制與.Net/Java那種全自動的垃圾回收機制是不同的,它本質上還是C語言中的手動管理方式,只不過稍微加了一些自動方法。

1 Objective-C的對象生成于堆之上,生成之后,需要一個指針來指向它。

  1.   ClassA *obj1 = [[ClassA alloc] init]; 

2 Objective-C的對象在使用完成之后不會自動銷毀,需要執行dealloc來釋放空間(銷毀),否則內存泄露。這帶來了一個問題。下面代碼中obj2是否需要調用dealloc?

  1.   ClassA *obj1 = [[ClassA alloc] init];  
  2.   ClassA *obj2 = obj1;  
  3.   [obj1 hello]; //輸出hello  
  4.   [obj1 dealloc];  
  5.   [obj2 hello]; //能夠執行這一行和下一行嗎?  
  6.   [obj2 dealloc]; 

不能,因為obj1和obj2只是指針,它們指向同一個對象,[obj1 dealloc]已經銷毀這個對象了,不能再調用[obj2 hello]和[obj2 dealloc]。obj2實際上是個無效指針。

如何避免無效指針?請看下一條。

3 Objective-C采用了引用計數(ref count或者retain count)。對象的內部保存一個數字,表示被引用的次數。例如,某個對象被兩個指針所指向(引用)那么它的retain count為2。需要銷毀對象的時候,不直接調用dealloc,而是調用release。release會讓retain count減1,只有retain count等于0,系統才會調用dealloc真正銷毀這個對象。

  1.   ClassA *obj1 = [[ClassA alloc] init]; //對象生成時,retain count = 1 
  2.   [obj1 release]; //release使retain count減1,retain count = 0,dealloc自動被調用,對象被銷毀 

我們回頭看看剛剛那個無效指針的問題,把dealloc改成release解決了嗎?

  1.   ClassA *obj1 = [[ClassA alloc] init]; //retain count = 1 
  2.   ClassA *obj2 = obj1; //retain count = 1 
  3.   [obj1 hello]; //輸出hell  
  4.   [obj1 release]; //retain count = 0,對象被銷毀  
  5.   [obj2 hello];  
  6.   [obj2 release];  
  7.   [obj1 release]之后,obj2依然是個無效指針。問題依然沒有解決。解決方法見下一條。  
  8.   4 Objective-C指針賦值時,retain count不會自動增加,需要手動retain。  
  9.   ClassA *obj1 = [[ClassA alloc] init]; //retain count = 1 
  10.   ClassA *obj2 = obj1; //retain count = 1 
  11.   [obj2 retain]; //retain count = 2 
  12.   [obj1 hello]; //輸出hello  
  13.   [obj1 release]; //retain count = 2 ? 11 = 1  
  14.   [obj2 hello]; //輸出hello  
  15.   [obj2 release]; //retain count = 0,對象被銷毀 

問題解決!注意,如果沒有調用[obj2 release],這個對象的retain count始終為1,不會被銷毀,內存泄露。(1-4可以參考附件中的示例程序memman-no-pool.m)

這樣的確不會內存泄露,但似乎有點麻煩,有沒有簡單點的方法?見下一條。

5 Objective-C中引入了autorelease pool(自動釋放對象池),在遵守一些規則的情況下,可以自動釋放對象。(autorelease pool依然不是.Net/Java那種全自動的垃圾回收機制)

5.1 新生成的對象,只要調用autorelease就行了,無需再調用release!

ClassA *obj1 = [[[ClassA alloc] init] autorelease]; //retain count = 1 但無需調用release

5.2 對于存在指針賦值的情況,代碼與前面類似。

  1.   ClassA *obj1 = [[[ClassA alloc] init] autorelease]; //retain count = 1 
  2.   ClassA *obj2 = obj1; //retain count = 1 
  3.   [obj2 retain]; //retain count = 2 
  4.   [obj1 hello]; //輸出hello  
  5.   //對于obj1,無需調用(實際上不能調用)release  
  6.   [obj2 hello]; //輸出hello  
  7.   [obj2 release]; //retain count = 2-1 = 1 

細心的讀者肯定能發現這個對象沒有被銷毀,何時銷毀呢?誰去銷毀它?(可以參考附件中的示例程序memman-with-pool.m)請看下一條。

6 autorelease pool原理剖析。(其實很簡單的,一定要堅持看下去,否則還是不能理解Objective-C的內存管理機制。)

6.1 autorelease pool不是天生的,需要手動創立。只不過在新建一個iphone項目時,xcode會自動幫你寫好。autorelease
  
pool的真名是NSAutoreleasePool。

  1. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

6.2 NSAutoreleasePool內部包含一個數組(NSMutableArray),用來保存聲明為autorelease的所有對象。如果一個對象聲明為autorelease,系統所做的工作就是把這個對象加入到這個數組中去。

ClassA *obj1 = [[[ClassA alloc] init] autorelease]; //retain count = 1,把此對象加入autorelease pool中

6.3 NSAutoreleasePool自身在銷毀的時候,會遍歷一遍這個數組,release數組中的每個成員。如果此時數組中成員的retain count為1,那么release之后,retain count為0,對象正式被銷毀。如果此時數組中成員的retain count大于1,那么release之后,retain count大于0,此對象依然沒有被銷毀,內存泄露。

6.4 默認只有一個autorelease pool,通常類似于下面這個例子。

  1.   int main (int argc, const char *argv[])  
  2.   {  
  3.   NSAutoreleasePool *pool;  
  4.  
  5. pool = [[NSAutoreleasePool alloc] init];  
  6.   // do something  
  7.   [pool release];  
  8.   return (0);  
  9.   } // main 

所有標記為autorelease的對象都只有在這個pool銷毀時才被銷毀。如果你有大量的對象標記為autorelease,這顯然不能很好的利用內存,在iphone這種內存受限的程序中是很容易造成內存不足的。例如:

  1.   int main (int argc, const char *argv[])  
  2.   {  
  3.   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
  4.   int i, j;  
  5.   for (i = 0; i < 100; i++ )  
  6.   {  
  7.   for (j = 0; j < 100000; j++ )  
  8.   [NSString stringWithFormat:@"1234567890"];//產生的對象是autorelease的。  
  9.   }  
  10.   [pool release];  
  11.   return (0);  
  12.   } // main 

(可以參考附件中的示例程序memman-many-objs-one-pool.m,運行時通過監控工具可以發現使用的內存在急劇增加,直到pool銷毀時才被釋放)你需要考慮下一條。

7 Objective-C程序中可以嵌套創建多個autorelease pool。在需要大量創建局部變量的時候,可以創建內嵌的autorelease pool來及時釋放內存。(感謝網友hhyytt和neogui的提醒,某些情況下,系統會自動創建autorelease pool, 請參見第四章)

  1.   int main (int argc, const char *argv[])  
  2.   {  
  3.   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
  4.   int i, j;  
  5.   for (i = 0; i < 100; i++ )  
  6.   {  
  7.   NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];  
  8.   for (j = 0; j < 100000; j++ )  
  9.   [NSString stringWithFormat:@"1234567890"];//產生的對象是autorelease的。  
  10.   [loopPool release];  
  11.   }  
  12.   [pool release];  
  13.   return (0);  
  14.   } // main 

(可以參考附件中的示例程序memman-many-objs-many-pools.m,占用內存的變化極小)

二 口訣與范式

1 口訣。

1.1 誰創建,誰釋放(類似于“誰污染,誰治理”)。如果你通過alloc、new或copy來創建一個對象,那么你必須調用release或autorelease。換句話說,不是你創建的,就不用你去釋放。
例如,你在一個函數中alloc生成了一個對象,且這個對象只在這個函數中被使用,那么你必須在這個函數中調用release或autorelease。如果你在一個class的某個方法中alloc一個成員對象,且沒有調用autorelease,那么你需要在這個類的dealloc方法中調用release;如果調用了autorelease,那么在dealloc方法中什么都不需要做。
  
1.2 除了alloc、new或copy之外的方法創建的對象都被聲明了autorelease。
  
1.3 誰retain,誰release。只要你調用了retain,無論這個對象是如何生成的,你都要調用release。有時候你的代碼中明明沒有retain,可是系統會在默認實現中加入retain。不知道為什么蘋果公司的文檔沒有強調這個非常重要的一點,請參考范式2.7和第三章。

2 范式。

范式就是模板,就是依葫蘆畫瓢。由于不同人有不同的理解和習慣,我總結的范式不一定適合所有人,但我能保證照著這樣做不會出問題。

2.1 創建一個對象。

  1.   ClassA *obj1 = [[ClassA alloc] init]; 

2.2 創建一個autorelease的對象。

  1.   ClassA *obj1 = [[[ClassA alloc] init] autorelease]; 

2.3 Release一個對象后,立即把指針清空。(順便說一句,release一個空指針是合法的,但不會發生任何事情)

  1.   [obj1 release];  
  2.   obj1 = nil

2.4 指針賦值給另一個指針。

  1.   ClassA *obj2 = obj1;  
  2.   [obj2 retain];  
  3.   //do something  
  4.   [obj2 release];  
  5.   obj2 = nil

2.5 在一個函數中創建并返回對象,需要把這個對象設置為autorelease

  1.   ClassA *Func1()  
  2.   {  
  3.   ClassA *obj = [[[ClassA alloc]init]autorelease];  
  4.   return obj;  
  5.   } 

2.6 在子類的dealloc方法中調用基類的dealloc方法

  1.   -(void) dealloc  
  2.   {  
  3.   …  
  4.   [super dealloc];  
  5.   } 

2.7 在一個class中創建和使用property。

2.7.1 聲明一個成員變量。

  1.   ClassB *objB; 

2.7.2 聲明property,加上retain參數。

  1. @property (retain) ClassB* objB; 

2.7.3 定義property。(property的默認實現請看第三章)

  1.   @synthesize objB; 

2.7.4 除了dealloc方法以外,始終用.操作符的方式來調用property。

  1.   self.objB 或者objA.objB 

2.7.5 在dealloc方法中release這個成員變量。

  1.   [objB release]; 

示例代碼如下(詳細代碼請參考附件中的memman-property.m,你需要特別留意對象是在何時被銷毀的。):

  1.   @interface ClassA : NSObject  
  2.   {  
  3.   ClassB* objB;  
  4.   }  
  5.   @property (retain) ClassB* objB;  
  6.   @end  
  7.   @implementation ClassA  
  8.   @synthesize objB;  
  9.   -(void) dealloc  
  10.   {  
  11.   [objB release];  
  12.   [super dealloc];  
  13.   }  
  14.   @end 

2.7.6 給這個property賦值時,有手動release和autorelease兩種方式。

  1.   void funcNoAutorelease()  
  2.   {  
  3.   ClassB *objB1 = [[ClassB alloc]init];  
  4.   ClassA *objA = [[ClassA alloc]init];  
  5.   objA.objB = objB1;  
  6.   [objB1 release];  
  7.   [objA release];  
  8.   }  
  9.   void funcAutorelease()  
  10.   {  
  11.   ClassB *objB1 = [[[ClassB alloc]init] autorelease];  
  12.   ClassA *objA = [[[ClassA alloc]init] autorelease];  
  13.   objA.objB = objB1;  

三 @property (retain)和@synthesize的默認實現

在這里解釋一下@property (retain) ClassB* objB;和@synthesize objB;背后到底發生了什么(retain property的默認實現)。property實際上是getter和setter,針對有retain參數的property,背后的實現如下(請參考附件中的memman-getter-setter.m,你會發現,結果和memman-property.m一樣):

  1.   @interface ClassA : NSObject  
  2.   {  
  3.   ClassB *objB;  
  4.   }  
  5.   -(ClassB *) getObjB;  
  6.   -(void) setObjB:(ClassB *) value;  
  7.   @end  
  8.   @implementation ClassA  
  9.   -(ClassB*) getObjB  
  10.   {  
  11.   return objB;  
  12.   }  
  13.   -(void) setObjB:(ClassB*) value  
  14.   {  
  15.   if (objB != value)  
  16.   {  
  17.   [objB release];  
  18.   objB = [value retain];  
  19.   }  
  20.   } 

在setObjB中,如果新設定的值和原值不同的話,必須要把原值對象release一次,這樣才能保證retain count是正確的。

由于我們在class內部retain了一次(雖然是默認實現的),所以我們要在dealloc方法中release這個成員變量。

  1.   -(void) dealloc  
  2.   {  
  3.   [objB release];  
  4.   [super dealloc];  
  5.   } 

四 系統自動創建新的autorelease pool

在生成新的Run Loop的時候,系統會自動創建新的autorelease pool(非常感謝網友hhyytt和neogui的提醒)。注意,此處不同于xcode在新建項目時自動生成的代碼中加入的autorelease pool,xcode生成的代碼可以被刪除,但系統自動創建的新的autorelease pool是無法刪除的(對于無Garbage Collection的環境來說)。Objective-C沒有給出實現代碼,官方文檔也沒有說明,但我們可以通過小程序來證明。

在這個小程序中,我們先生成了一個autorelease pool,然后生成一個autorelease的ClassA的實例,再在一個新的run loop中生成一個autorelease的ClassB的對象(注意,我們并沒有手動在新run loop中生成autorelease pool)。精簡的示例代碼如下,詳細代碼請見附件中的memman-run-loop-with-pool.m。

  1.   int main(int argc, char**argv)  
  2.   {  
  3.   NSLog(@"create an autorelasePool  
  4. ");   
  5.   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
  6.   NSLog(@"create an instance of ClassA and autorelease ");  
  7.   ClassA *obj1 = [[[ClassA alloc] init] autorelease];  
  8.   NSDate *now = [[NSDate alloc] init];  
  9.   NSTimer *timer = [[NSTimer alloc] initWithFireDate:now  
  10.   interval:0.0  
  11.   target:obj1  
  12.   selector:@selector(createClassB)  
  13.   userInfo:nil  
  14.   repeats:NO];  
  15.   NSRunLoop *runLoop = [NSRunLoop currentRunLoop];  
  16.   [runLoop addTimer:timer forMode:NSDefaultRunLoopMode];  
  17.   [timer release];  
  18.   [now release];  
  19.   [runLoop run]; //在新loop中調用一函數,生成ClassB的autorelease實例  
  20.   NSLog(@"releasing autorelasePool ");  
  21.   [pool release];  
  22.   NSLog(@"autorelasePool is released ");  
  23.   return 0;  
  24.   } 

輸出如下:

  1.   create an autorelasePool  
  2.   create an instance of ClassA and autorelease  
  3.   create an instance of ClassB and autorelease  
  4.   ClassB destroyed  
  5.   releasing autorelasePool  
  6.   ClassA destroyed  
  7.   autorelasePool is released 

注意在我們銷毀autorelease pool之前,ClassB的autorelease實例就已經被銷毀了。

有人可能會說,這并不能說明新的run loop自動生成了一個新的autorelease pool,說不定還只是用了老的autorelease pool,只不過后來drain了一次而已。我們可以在main函數中不生成autorelease pool。精簡的示例代碼如下,詳細代碼請見附件中的memman-run-loop-without-pool.m。

  1.   int main(int argc, char**argv)  
  2.   {  
  3.   NSLog(@"No autorelasePool created ");  
  4.   NSLog(@"create an instance of ClassA ");  
  5.   ClassA *obj1 = [[ClassA alloc] init];  
  6.   NSDate *now = [[NSDate alloc] init];  
  7.   NSTimer *timer = [[NSTimer alloc] initWithFireDate:now  
  8.   interval:0.0  
  9.   target:obj1  
  10.   selector:@selector(createClassB)  
  11.   userInfo:nil  
  12.   repeats:NO];  
  13.   NSRunLoop *runLoop = [NSRunLoop currentRunLoop];  
  14.   [runLoop addTimer:timer forMode:NSDefaultRunLoopMode];  
  15.   [timer release];  
  16.   [now release];  
  17.   [runLoop run]; //在新loop中調用一函數,生成ClassB的autorelease實例  
  18.   NSLog(@"Manually release the instance of ClassA ");  
  19.   [obj1 release];  
  20.   return 0;  
  21.   } 

輸出如下:

  1.   No autorelasePool created  
  2.   create an instance of ClassA  
  3.   create an instance of ClassB and autorelease  
  4.   ClassB destroyed  
  5.   Manually release the instance of ClassA  
  6.   ClassA destroyed 

我們可以看出來,我們并沒有創建任何autorelease pool,可是ClassB的實例依然被自動銷毀了,這說明新的run loop自動創建了一個autorelease pool,這個pool在新的run loop結束的時候會銷毀自己(并自動release所包含的對象)。

補充說明

在研究retain count的時候,我不建議用NSString。因為在下面的語句中,

  1. NSString *str1 = @”constant string”; 

str1的retain count是個很大的數字。Objective-C對常量字符串做了特殊處理。

當然,如果你這樣創建NSString,得到的retain count依然為1

  1.   NSString *str2 = [NSString stringWithFormat:@”123”]; 

小結:Objective-C內存管理教程和原理剖析的內容介紹完了,希望本文對你有所幫助。

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-07-21 09:42:27

Objective-C 內存 Autoreleas

2013-04-11 14:37:36

Objective-CiOS內存管理系統自動創建新的aut

2013-04-11 14:32:00

Objective-CiOS開發內存管理@synthesize

2013-04-11 13:57:27

Objective-CiOS開發內存管理

2013-04-11 14:16:57

Objective-CiOS開發內存管理

2011-07-18 17:14:16

Objective-C 內存 Cocoa

2011-07-29 16:08:31

Objective-C 內存

2011-07-27 17:10:30

Objective-C 持久化

2011-05-11 15:45:50

內存管理Objective-C

2011-07-21 09:32:07

Objective-C 內存 Autoreleas

2011-07-21 10:10:42

Objective-C 內存 Autoreleas

2011-07-20 17:04:43

Objective-C 內存 內存泄露

2011-08-16 17:43:47

Objective-C內存管理Autorelease

2011-08-01 11:37:41

iPhone Objective- 內存

2011-08-18 13:28:35

Objective-C內存

2011-07-08 13:49:46

Objective-C UUID

2011-08-05 14:03:39

Objective-C 對象 模板

2011-08-22 09:48:16

WindowsObjective-C

2011-08-16 10:23:04

Objective-CNSAutoreleaXcode常用鍵

2013-05-02 10:51:17

iOS開發Objective-C@property
點贊
收藏

51CTO技術棧公眾號

欧美精品生活片| 欧美日韩亚洲一区二| 川上优av一区二区线观看| 1024手机在线视频| 欧美一区自拍| 欧美三级在线视频| 激情成人开心网| 国产高清一级毛片在线不卡| 国产一区在线精品| 日本精品免费一区二区三区| 欧美激情精品久久久久久免费 | 国产精品入口夜色视频大尺度 | 日韩午夜在线| 日韩在线中文视频| 国产精品一级黄片| 国产精品久久久久久久久久久久久久久 | 国产精品久久成人免费观看| 天天干,夜夜操| 国产在线精品免费av| 国产91精品视频在线观看| 在线观看黄网址| 深爱激情综合| 精品国产乱码久久久久久1区2区| 性chinese极品按摩| 国产ktv在线视频| 国产精品午夜电影| 另类小说综合网| 亚洲精品国偷拍自产在线观看蜜桃| 日本欧美一区二区三区| 91精品国产免费久久久久久| 青青草成人免费| 国产电影一区二区在线观看| 精品亚洲aⅴ在线观看| 特级特黄刘亦菲aaa级| 色综合一区二区日本韩国亚洲 | 亚洲三级在线观看视频| 欧美成人黑人| 欧美色播在线播放| www.射射射| 欧美xxx黑人xxx水蜜桃| 日韩毛片在线免费观看| 午夜精品一区二区三区四区| 免费观看国产视频| 成人毛片老司机大片| 91在线短视频| 午夜美女福利视频| 国产高清成人在线| 99热国产免费| 亚洲黄色精品视频| 粉嫩aⅴ一区二区三区四区| 亚洲a区在线视频| 国产欧美一级片| 国产一区二区三区精品欧美日韩一区二区三区| 国产精品一区二区三区成人| 精品久久久久久久久久久国产字幕| 国产亚洲亚洲| 日本免费久久高清视频| 日本免费在线观看视频| 久久综合亚州| 国产精品久久久久久久久| 日本丰满少妇做爰爽爽| 日韩高清在线观看| 国产日韩av高清| 国产成人精品白浆久久69| 国产成人福利片| 成人在线免费观看一区| 午夜美女福利视频| 91色在线porny| 美女三级99| 超碰在线国产| 亚洲欧美日韩中文字幕一区二区三区| 天堂av在线中文| 99riav视频在线观看| 日韩欧美亚洲范冰冰与中字| 精品久久久噜噜噜噜久久图片| 成人国产激情| 欧美不卡一区二区三区| 在线免费观看成年人视频| sdde在线播放一区二区| 中文字幕日韩有码| 麻豆视频在线观看| 久久久噜噜噜| 成人网在线视频| 免费国产羞羞网站视频| 久久久精品免费免费| 日本一区二区三区免费看| 国精产品一区| 精品久久久久久久久久久| 欧美在线观看视频网站| 国产美女亚洲精品7777| 亚洲激情免费观看| 亚洲区一区二区三| 亚洲精选国产| 91欧美精品午夜性色福利在线| 黑人精品一区二区三区| 欧美国产精品一区二区三区| 国产乱人伦精品一区二区三区| 成年美女黄网站色大片不卡| 欧美卡1卡2卡| 少妇真人直播免费视频| 欧美精品观看| 欧美最猛性xxxxx亚洲精品| 国产又粗又猛又爽又黄视频| 成人动漫一区二区| 在线成人性视频| 2022成人影院| 日韩欧美美女一区二区三区| 欧美成人另类视频| 亚洲欧洲日本mm| 成人亚洲激情网| 久久视频www| 亚洲高清中文字幕| 亚洲色图偷拍视频| 精品九九在线| 91福利视频网| 欧美视频在线观看一区二区三区| 中文字幕欧美日本乱码一线二线| 精品无码一区二区三区爱欲| 亚洲国产精选| 一区二区成人精品| 久热这里只有精品6| 国产精品一品视频| 一区二区视频国产| 日本精品网站| 亚洲女人天堂成人av在线| 天堂资源在线播放| 国产一区二区0| 伊人久久av导航| 国产第一精品| 亚洲一级免费视频| 91在线视频在线观看| 成人国产亚洲欧美成人综合网| 免费久久久久久| 一区二区三区日本视频| 中文字幕在线亚洲| 在线视频欧美亚洲| 中文字幕国产精品一区二区| 久久精品午夜福利| 免费视频亚洲| 国产97色在线| 精品美女视频在线观看免费软件| 婷婷激情综合网| 一边摸一边做爽的视频17国产| 欧美日韩三区| 国产精选在线观看91| 日韩免费影院| 亚洲成人av片| 日韩美女一级片| 成a人片亚洲日本久久| 很污的网站在线观看| 欧美变态网站| 日韩av电影手机在线观看| 欧美男男激情freegay| 欧美性猛交视频| 三级网站在线免费观看| 日韩电影在线免费看| 亚洲第一导航| 国产精品xnxxcom| 色综合天天狠天天透天天伊人| 国产青青草视频| 亚洲综合一区二区精品导航| 久久久久久久穴| 日韩视频不卡| 日韩欧美视频一区二区| 美女色狠狠久久| 久久精品视频在线播放| 成 人 黄 色 片 在线播放| 亚洲第一激情av| 手机av免费看| 麻豆精品在线播放| 中文字幕在线中文| 天天久久夜夜| 国产精品丝袜久久久久久不卡| 久久99精品久久| 日韩网站在线看片你懂的| 日韩少妇高潮抽搐| 国产日产欧美一区| 一级 黄 色 片一| 亚洲人成久久| 亚洲一区二区三区欧美| 日韩免费成人| 国产91亚洲精品| 国产不卡在线| 亚洲欧美福利视频| 国产又大又黄又爽| 午夜久久久影院| 亚洲图片第一页| 成人中文字幕合集| 亚洲激情在线观看视频| 欧美日韩成人| 色视频一区二区三区| 精品精品视频| 国产精品h在线观看| 日韩少妇视频| 色噜噜狠狠色综合网图区| 欧美 日韩 国产 精品| 日本道在线观看一区二区| 欧美性猛交xxxxx少妇| 久久免费精品国产久精品久久久久| 伊人色在线观看| 亚洲另类黄色| 喜爱夜蒲2在线| 国产一区不卡| 黄色91av| 午夜视频一区二区在线观看| 国产精品99久久久久久久久| 欧美人与牲禽动交com| 中文国产亚洲喷潮| 日韩一二三四| 亚洲精品一区二区精华| 国产一区二区麻豆| 91国在线观看| 亚洲免费在线观看av| 亚洲精品国产无天堂网2021| 亚洲午夜久久久久久久国产| 不卡区在线中文字幕| 中文字幕乱码在线人视频| 日本伊人色综合网| www.com毛片| 亚洲激情欧美| 久久www视频| 亚洲成人一区| 亚洲综合五月天| 欧美一二区在线观看| 成人综合色站| 狂野欧美xxxx韩国少妇| 国产精品丝袜久久久久久高清 | 3d成人h动漫网站入口| 亚洲 欧美 日韩 在线| 精品福利在线看| 豆国产97在线 | 亚洲| 亚洲精品视频在线观看免费| 最新黄色av网址| 国产精品水嫩水嫩| 欧美福利第一页| 国产女主播一区| 欧美三级视频网站| 欧美激情一区二区| 亚洲色图 激情小说| 中文av字幕一区| 欧美成人久久久免费播放| 国产欧美日韩视频在线观看| 国产av自拍一区| 国产亚洲一本大道中文在线| 亚洲人成人无码网www国产 | 国产免费无码一区二区视频 | 一本大道东京热无码aⅴ| 亚洲一区二区日韩| 久久视频免费在线| 狠狠综合久久| 伊人成色综合网| 美女诱惑一区| 国产小视频精品| 国产中文一区二区三区| 久久久久久久久久久影视| 国产另类ts人妖一区二区| 国产在线a视频| a级精品国产片在线观看| 成人手机在线免费视频| 2019国产精品| 国产三级短视频| 亚洲日韩欧美一区二区在线| 欧洲猛交xxxx乱大交3| 亚洲福利电影网| www.久久精品视频| 欧美日韩免费一区二区三区视频| 国产又黄又爽视频| 精品99久久久久久| 男人天堂网在线| 色99之美女主播在线视频| av在线官网| 8090成年在线看片午夜| 亚洲mmav| 亚洲一区久久久| 日本午夜精品| 一区二区三区四区欧美| 国模一区二区三区| 国产精品动漫网站| 久久国产精品99久久人人澡| 久久久久99人妻一区二区三区| 久久夜色精品国产噜噜av| 东京热无码av男人的天堂| 一区二区免费在线| 亚洲熟女综合色一区二区三区| 欧美日韩午夜在线视频| 国精产品一品二品国精品69xx| 亚洲人成啪啪网站| 成人video亚洲精品| 日本道色综合久久影院| 996久久国产精品线观看| 精品一卡二卡三卡四卡日本乱码| 日韩一区欧美| 好吊妞无缓冲视频观看| 麻豆国产精品777777在线| 亚洲の无码国产の无码步美| 国产精品福利影院| av资源免费观看| 日韩视频一区二区| 国产日本在线观看| 久久琪琪电影院| 四虎影视精品永久在线观看| 狠狠色噜噜狠狠色综合久| 国产精品久久占久久| 久久久精品在线视频| 成人精品一区二区三区四区| xxxxx99| 欧美视频裸体精品| www.国产麻豆| 日韩在线观看免费网站| 色是在线视频| 国产精品久久精品国产| 99久久久久| 美女网站免费观看视频| eeuss影院一区二区三区 | 欧美精品日韩| 伊人国产在线视频| 久久综合精品国产一区二区三区| 免费毛片在线播放免费| 欧美精品99久久久**| 国产人成在线视频| 日韩美女免费视频| 三级小说欧洲区亚洲区| 妞干网视频在线观看| 国精产品一区一区三区mba桃花 | 风间由美一区| 日本欧美中文字幕| 色婷婷av一区二区三区丝袜美腿| 97中文字幕在线| 国产精品资源站在线| 天堂а√在线中文在线鲁大师| 欧洲色大大久久| 理论视频在线| 国产精品高潮呻吟久久av野狼 | 成人免费视频一区| 特级片在线观看| 欧美一区二区美女| 成人黄视频在线观看| 成人欧美一区二区三区在线湿哒哒| 久久综合av| 看看黄色一级片| 中文字幕亚洲电影| 国产精品爽爽久久久久久| 色偷偷888欧美精品久久久 | 欧美一区二区三区人| 精品51国产黑色丝袜高跟鞋| 成人网在线观看| 欧美黄色一区二区| 91精品国产高清91久久久久久| 亚洲精品少妇30p| 亚洲经典一区二区三区| 午夜精品一区二区三区在线视| 国产伦精品一区二区三区在线播放 | 黄色成年人视频在线观看| 成人在线观看视频网站| 亚洲最新av| 国产白袜脚足j棉袜在线观看| 亚洲国产成人精品视频| 亚洲 欧美 激情 另类| 日韩免费av在线| 99久久夜色精品国产亚洲1000部| 中文字幕中文在线| 一区二区在线免费观看| 日日躁夜夜躁白天躁晚上躁91| 欧美一区二区三区图| 不卡av一区二区| aaa一级黄色片| 亚洲一区二三区| 少妇激情av一区二区| 国产精品香蕉国产| 欧美在线精品一区| 亚洲调教欧美在线| 欧美午夜一区二区三区 | 欧美在线精品免播放器视频| 精品大片一区二区| 成年人网站av| 舔着乳尖日韩一区| 99reav在线| yellow视频在线观看一区二区| 一本色道久久综合亚洲精品高清 | 黄色视屏网站在线免费观看| 国产美女久久精品| 亚洲午夜黄色| 亚洲无人区码一码二码三码的含义| 欧美久久久久久久久| 免费男女羞羞的视频网站在线观看| 免费精品视频一区二区三区| 精久久久久久久久久久| 精品在线播放视频| 精品国产一区二区三区久久狼5月| 超碰成人免费| 日韩欧美国产片| 午夜婷婷国产麻豆精品| av电影在线观看一区二区三区| 俄罗斯精品一区二区三区| 日韩高清在线电影| 国产网站在线看| 日韩有码在线观看| 亚洲丁香日韩| 亚洲av午夜精品一区二区三区| 欧美在线不卡视频|